我想检测ScrollView何时完成滚动,以便稍微修改其位置。 以前,我使用ACTION_UP来检测用户何时放开手指,但后来我意识到这不允许我使用“flinging”,因为它会在滚动完成之前修改滚动。
有没有办法检测ScrollView何时完成滚动? 或者像ListView一样检测其滚动状态?
还有其他实现此目的的想法吗?
谢谢。
我想检测ScrollView何时完成滚动,以便稍微修改其位置。 以前,我使用ACTION_UP来检测用户何时放开手指,但后来我意识到这不允许我使用“flinging”,因为它会在滚动完成之前修改滚动。
有没有办法检测ScrollView何时完成滚动? 或者像ListView一样检测其滚动状态?
还有其他实现此目的的想法吗?
谢谢。
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView {
private static final int WHAT = 1;
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(!hasMessages(WHAT)) {
Log.i("TestScroll", "Last msg!. Position from "
+ msg.arg1 + " to " + msg.arg2);
}
}
}
private Handler mHandler = new MyHandler();
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
final Message msg = Message.obtain();
msg.arg1 = oldt;
msg.arg2 = t;
msg.what = WHAT;
mHandler.sendMessageDelayed(msg, 500);
}
}
我会通过创建一个ScrollView的子类,比如MyScrollView,并使用它来代替ScrollView来解决这个问题。
这样你就可以重写ScrollView的方法,在滚动时调用它们,并在其中添加一些回调(不要忘记调用相应的super
方法)。
我无法确定ScrollView的哪些方法会被调用;我假设每次滚动发生时都会调用其中一个方法,但是哪一个呢...也许只是scrollTo()
。
我想重写所有这些方法并记录它们被调用的时间可能会是一个非常有趣和有收获的经验。如果我这样做了,我会回来提供更有用的答案,假设在那段时间内没有其他人提供了答案。
scrollTo()
的源代码有一个注释,说每次调用scrollBy()
时都应该调用它 - 所以我倾向于首先重写scrollTo()
。祝你阅读愉快 :-) - JoubarcHandler
更容易 - 每次滚动事件触发时,使用PostDelayed
(例如延迟1秒);你发布的可运行文件可以简单地检查队列中是否还有更多的消息。如果没有,那么在过去的一秒钟内没有发生更多的滚动事件,你可以做一些不同的事情。当我有时间时,我可能也会测试一下这个方法。 - Joubarc