当前位置:操作系统 > 安卓/Android >>

[Android] ScrollView滚动到底部和顶部的检测

1. 源起

 


    很多分页加载的组件都是继承自ScrollView,分页要检查是否滚动到底部,下拉刷新需要检测是否滚动到顶部。

 


2. 代码

 


 

<SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://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="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://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

 

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,