我在滚动视图中的文本视图中有一个固定的内容。当用户滚动到某个位置时,我想开始一个活动或触发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回答,是否有一个更简单的解决方案,而不是声明一个界面,覆盖滚动视图等,如我发布的链接所示?
答案 0 :(得分:48)
有一种比继承ScrollView
更简单的方法。 ViewTreeObserver
的{{1}}对象可用于侦听滚动。
由于ScrollView
对象可能会在ViewTreeObserver
的生命周期内发生变化,因此我们需要在ScrollView
上注册OnTouchListener
以获取ScrollView
滚动的时间。
ViewTreeObserver
答案 1 :(得分:13)
没有
ScrollView不提供滚动事件的监听器,甚至不提供检查用户滚动距离的方法,因此您必须执行链接建议的操作。
答案 2 :(得分:9)
这个问题相当陈旧,但万一有人匆匆离开(像我一样):
从 API 23 开始,Android View
有一个OnScrollChangeListener
和matching 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)
只需使用NestedScroll
和NestedScroll.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
}
});