Android:如何判断视图是否正在滚动?

3
在iPhone上,这很简单——每个视图都有一个scrollViewDidScroll方法。我正在尝试找到Android中的等效方法。
我的代码可以工作,但它没有给我想要的结果。我需要在整个视图滚动期间执行代码。因此,即使我使用OnGestureListener的onScroll方法,它仅在手指触摸屏幕时触发(它的名称并不准确——它应该被称为“onSlide”或“onSwipe”,侧重于手势而不是UI动画)。如果用户轻弹视图并且在用户放开手指后仍然滚动几秒钟,它不会继续触发。
是否有一种在滚动的每一步调用的方法?
public class Scroll extends Activity implements OnGestureListener {

public  WebView         webview;

public  GestureDetector gestureScanner;

public  int         currentYPosition;
public  int         lastYPosition;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    webview = new WebView(this);
    setContentView(webview);
    webview.loadUrl("file:///android_asset/Scroll.html");

    gestureScanner = new GestureDetector(this);

    currentYPosition = 0;
    lastYPosition = 0;

}


public boolean onTouchEvent(final MotionEvent me) {
    return gestureScanner.onTouchEvent(me);
}


public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    // I do stuff here.
    return true;
}
3个回答

4

我玩过一点WebView,但没有找到跟踪滚动的方法,但你是否一定需要使用WebView?如果你正在使用ListView或GridView,可以实现ListView.OnScrollListener方法,特别是onScrollStateChanged和onScroll。前者非常有用,因为它会给你关于列表正在做什么的更新,即使对于用户'flinging'列表并且它在之后继续滚动的情况下也是如此。以下是如何跟踪的示例:

public class List13 extends ListActivity implements ListView.OnScrollListener {

(...)

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
        case OnScrollListener.SCROLL_STATE_IDLE:
            //List is idle
            break;
        case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
            //List is scrolling under the direct touch of the user
            break;
        case OnScrollListener.SCROLL_STATE_FLING:
            //The user did a 'fling' on the list and it's still scrolling
            break;
        }
    }
}

我直接从Google提供的代码示例中引用了这段话,例如“Api Demos”项目中的List13。如果您想更仔细地查看它,可以通过转到文件->新建->Android项目,从现有源创建项目,并导航到(您的SDK文件夹)/平台/(您正在使用的版本)/样本/ApiDemos将其导入Eclipse。如果您找不到它,则可能在设置SDK时未下载示例应用程序。您可以通过转到窗口 -> Android SDK和AVD管理器,然后在左侧的“可用软件包”下进行下载。


1
谢谢...这些WebViews似乎完全不同于任何其他Android视图。这是我在这个论坛上提出的第二个问题,结果是:"这是有道理的,但是WebView似乎是正常Android约定的一个未记录的异常情况。" 非常令人沮丧。小心WebViews! - Dave

1
尝试以下方法。
@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
}

它将在滚动后给您上次滚动的位置和新的滚动位置。


1
我认为你可能想使用View而不是Activity来实现这个功能。View有一个名为onScrollChanged的方法,听起来就像你想要的。如果不是这样,你还可以查看同一类别的computeScrollscrollByscrollTo方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接