[Android] ScrollView滾動到底部和頂部的檢測

1. 源起

 

    很多分頁加載的組件都是繼承自ScrollView,分頁要檢查是否滾動到底部,下拉刷新需要檢測是否滾動到頂部。

 

2. 代碼

 

 

<SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px"><RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" 
    xmlns:tools="https://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 
 
    <ScrollView 
        android:id="@+id/scroll_view" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:scrollbars="vertical" > 
 
        <LinearLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:background="@android:color/darker_gray" 
            android:orientation="vertical" > 
 
            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="2000dip" 
                android:text="text" /> 
        </LinearLayout> 
    </ScrollView> 
 
</RelativeLayout></SPAN> 

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/darker_gray"
            android:orientation="vertical" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="2000dip"
                android:text="text" />
        </LinearLayout>
    </ScrollView>

</RelativeLayout>[java] view plaincopyprint?
<SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">public class MainActivity extends Activity { 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final ScrollView view = (ScrollView) findViewById(R.id.scroll_view); 
    view.setOnTouchListener(new OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
            switch (event.getAction()) { 
            case MotionEvent.ACTION_DOWN: 
                break; 
            case MotionEvent.ACTION_MOVE: 
                if (v.getScrollY() <= 0) { 
                    Log.d("scroll view", "top"); 
                } else if (view.getChildAt(0).getMeasuredHeight() <= v.getHeight() + v.getScrollY()) { 
                    Log.d("scroll view", "bottom"); 
                    Log.d("scroll view", "view.getMeasuredHeight() = " + view.getMeasuredHeight() 
                        + ", v.getHeight() = " + v.getHeight() 
                        + ", v.getScrollY() = " + v.getScrollY() 
                        + ", view.getChildAt(0).getMeasuredHeight() = " + view.getChildAt(0).getMeasuredHeight()); 
                } 
                break; 
            default: 
                break; 
            } 
            return false; 
    } }); 
    } 
}</SPAN> 

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ScrollView view = (ScrollView) findViewById(R.id.scroll_view);
    view.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                if (v.getScrollY() <= 0) {
                    Log.d("scroll view", "top");
                } else if (view.getChildAt(0).getMeasuredHeight() <= v.getHeight() + v.getScrollY()) {
                    Log.d("scroll view", "bottom");
                    Log.d("scroll view", "view.getMeasuredHeight() = " + view.getMeasuredHeight()
                        + ", v.getHeight() = " + v.getHeight()
                        + ", v.getScrollY() = " + v.getScrollY()
                        + ", view.getChildAt(0).getMeasuredHeight() = " + view.getChildAt(0).getMeasuredHeight());
                }
                break;
            default:
                break;
            }
            return false;
 } });
    }
}

3. 說明

    檢測滾動的時機有很多,這裡是在ScrollView外面檢測,使用onTouch的MotionEvent.ACTION_MOVE。如果是繼承ScrollView,可以在其他回調的時候檢測。

    v.getScrollY()表示scrollview的上面滾出去的長度。v.getHeight()表示scrollview本身看上去的高度。view.getChildAt(0).getMeasuredHeight()是內容的高度。這裡不能用view.getMeasureHeight()。

    view.getMeasuredHeight() = 1038

    v.getHeight() = 1038

    v.getScrollY() = 2962

    view.getChildAt(0).getMeasuredHeight() = 4000

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *