当前位置:编程学习 > wap >>

android ScrollView滚动到底部和顶部的检测

1. 源起

 
很多分页加载的组件都是继承自ScrollView,分页要检查是否滚动到底部,下拉刷新需要检测是否滚动到顶部。
(PS:一个不错的Android学习交流群:278744577,验证:cs,有兴趣的话可以加入进来一起讨论)
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 代码 ScrollView java --------------------编程问答-------------------- 学习了,LZ很不错哦
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,