2010-06-22 41 views
5

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

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

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

谢谢。

+0

尝试此链接:http://stackoverflow.com/questions/8181828/android-detect-when-scrollview-stops-scrolling – Shraddha 2012-05-23 05:46:24

回答

1

我会通过创建一个ScrollView的子类,比如说MyScrollView,并用它来代替ScrollView来解决这个问题。

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

我不能真正告诉你ScrollView的哪些方法将在何时被调用;我认为每次发生骚动时都会调用其中的一个,但哪一个......可能只是scrollTo()

我想这将是一个非常有趣和学习的经验,覆盖他们所有,只需登录时,他们被称为。如果我这样做,我可能会自己想这样做,但我肯定会回来一个更有用的答案,假设在此期间没有其他人做。

+0

感谢帮助。有没有什么地方可以找到ScrollView的源代码,这样我就可以看到它们是如何处理滚动的?我想我真的不需要改变它,只是添加一些东西到处理我的东西,但它仍然有助于看到他们的东西。 – Matt 2010-06-22 19:19:41

+0

检查ScrollView的源代码似乎也是一个不错的主意。我在那里找到了甜甜圈版本:http://www.netmite.com/android/mydroid/donut/frameworks/base/core/java/android/widget/ScrollView.java - 我看到'scrollTo()'的源代码一个评论说每调用一次'scrollBy()'就应该调用 - 所以我倾向于覆盖'scrollTo()'以开始。祝你好运与阅读:-) – Joubarc 2010-06-22 19:45:25

+4

只需重写onScrollChanged()。 – 2010-06-22 19:51:13

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

} 
+0

这并不能解决问题制作者所要求的 - 它只是在每次换卷时发送延迟的消息。 – Warlax 2011-04-21 14:25:10

+0

仅当用户半秒内完成滚动时才会打印日志消息。它解决了这个问题。 – Fede 2011-04-28 07:32:56

+0

这实际上是一个很棒的答案,它确实有效! – Anton 2013-02-28 01:55:27