Android scrollview onScrollChanged

时间:2010-11-24 02:48:38

标签: android android-scrollview onscrollchanged

我在滚动视图中的文本视图中有一个固定的内容。当用户滚动到某个位置时,我想开始一个活动或触发Toast

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:id="@+id/scroller">
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView android:layout_width="fill_parent" android:id="@+id/story"
   android:layout_height="wrap_content" android:text="@string/lorem"
   android:gravity="fill" />
 </LinearLayout>
</ScrollView>

我的问题是实现受保护的方法onScrollChanged以找出滚动视图的位置。

我找到this回答,是否有一个更简单的解决方案,而不是声明一个界面,覆盖滚动视图等,如我发布的链接所示?

10 个答案:

答案 0 :(得分:48)

有一种比继承ScrollView更简单的方法。 ViewTreeObserver的{​​{1}}对象可用于侦听滚动。

由于ScrollView对象可能会在ViewTreeObserver的生命周期内发生变化,因此我们需要在ScrollView上注册OnTouchListener以获取ScrollView滚动的时间。

ViewTreeObserver

答案 1 :(得分:13)

没有

ScrollView不提供滚动事件的监听器,甚至不提供检查用户滚动距离的方法,因此您必须执行链接建议的操作。

答案 2 :(得分:9)

这个问题相当陈旧,但万一有人匆匆离开(像我一样):

API 23 开始,Android View有一个OnScrollChangeListenermatching setter

支持库中的NestedScrollView也支持在该API级别之前设置滚动侦听器。据我所知,NestedScrollView可以作为普通ScrollView的替代品而没有任何问题。

答案 3 :(得分:8)

实际上有一种方法可以知道用户滚动了多远。 ScrollView中的方法getScrollY()告诉你。

答案 4 :(得分:2)

我扩展了我的scrollView。 This link可能有帮助。

class MyScroll extends ScrollView {
    boolean onTop=true;
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        //Log.d(TAG, "scroll changed: " + this.getTop() + " "+t);
        if(t <= 0){
            onTop = true;
            //Log.d(TAG, "scroll top: " + t);
            super.onScrollChanged(l, t, oldl, oldt);
            return;
            // reaches the top end
        }
        onTop = false;

        View view = (View) getChildAt(getChildCount()-1);
        int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));// Calculate the scrolldiff
        if( diff <= 0 ){
            // if diff is zero, then the bottom has been reached
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }
}

答案 5 :(得分:1)

NestedScrollView就像android.widget.ScrollView一样,但它支持在新旧版本的Android上充当嵌套滚动父级和子级。

1st - 使用NestedScrollView绑定代替ScrollView

2nd - 设置Scroll侦听器,如下所示,通过示例

检测为headerView移动的Y轴
    nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {

        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            Log.d(TAG, "onScrollChangeForY - scrollY: " + scrollY + " oldScrollY: " + oldScrollY);

            int MOVE = -1, SCROLL_UP = 0, SCROLL_DOWN = 1;
            float initialPositionY = headerView.getY();

            MOVE = scrollY > oldScrollY ? SCROLL_UP : SCROLL_DOWN;

            if (MOVE == SCROLL_UP) {

                int incrementY = scrollY - oldScrollY;

                headerView.setY(initialPositionY - incrementY);

            } else {

                int incrementY = oldScrollY - scrollY;

                headerView.setY(initialPositionY + incrementY);
            }
        }
    });

答案 6 :(得分:1)

您可以使用此代码检测是向上滚动还是向下滚动

scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            int lastScroll=0;
            @Override
            public void onScrollChanged() {
                int scrollY = scrollView.getScrollY(); // For ScrollView herzontial use getScrollX()

                if (scrollY > lastScroll ) {
                    Log.e("scroll","down scroll"+scrollY);
                } else if (scrollY < lastScroll ) {
                    Log.e("scroll","up scroll"+scrollY);
                }
                lastScroll=scrollY;
            }
        });

答案 7 :(得分:0)

只需使用NestedScrollNestedScroll.setOnScrollChangeListener()

答案 8 :(得分:0)

ready for use component,有助于收听Android中任意视图的滚动事件。在内部,此组件在具有旧Android API的设备上添加ViewTreeObserver滚动事件侦听器(类似于Shubhadeep Chaudhuri的回答中提出的),并在具有新Android API(API级别23+)的设备上查看滚动事件侦听器。

答案 9 :(得分:0)

您可以使用此触发器显示Toast或Start Activity

 scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
             // do something when Scroll  
        }
    });
相关问题