5

我试图检测 ScrollView 何时完成滚动,以便我可以稍微修改它的位置。在我使用 ACTION_UP 检测用户何时抬起手指之前,但后来我意识到这不允许我使用“投掷”,因为它会在滚动完成之前修改滚动。

有什么方法可以检测 ScrollView 何时完成滚动?或者像ListView一样检测它的滚动状态?

关于如何实现这一点的任何其他想法?

谢谢。

4

2 回答 2

3

我实施了一个基于 Jourbac 评论的解决方案。

问候

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);
    }

}
于 2010-11-02T12:18:52.987 回答
1

我会通过创建一个 ScrollView 的子类来解决这个问题,比如 MyScrollView,并使用它而不是 ScrollView。

这样你就可以覆盖滚动时调用的 ScrollView 的方法;并在其中添加某种形式的回调(不要忘记调用相应的方法super

我真的不能告诉你 ScrollView 的哪些方法会在什么时候被调用;我假设每次发生 scoll 时都会调用其中一个,但是哪一个......也许只是scrollTo().

我想将它们全部覆盖并在它们被调用时记录将是一个非常有趣和学习的体验。我可能想自己这样做,如果我这样做,我一定会回来提供更有用的答案,假设在那段时间没有其他人这样做。

于 2010-06-22T19:03:08.223 回答