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

时间:2010-03-19 19:53:33

标签: android scroll webview

在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 个答案:

答案 0 :(得分:4)

我使用WebView玩了一下,并没有找到跟踪滚动的方法,但你肯定需要它作为WebView吗?如果您使用的是ListView或GridView,则可以实现ListView.OnScrollListener方法,尤其是onScrollStateChangedonScroll。前者特别有用,因为它可以为您提供列表正在执行的操作的更新,即使您的用户“抛出”列表的具体示例也会在此后继续滚动一段时间。您将如何跟踪该示例的示例:

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

我直接从谷歌提供的代码示例中解脱出来,例如“Api Demos”项目中的List13。如果您想仔细研究一下,请转到File - >将其导入Eclipse。新 - > Android项目,从现有源创建项目,然后导航到(您的SDK文件夹)/ platforms /(您正在使用的版本)/ samples / ApiDemos。如果找不到,则在设置SDK时可能没有下载示例应用程序。您可以通过转到Window - >在Eclipse中完成此操作。 Android SDK和AVD Manager,然后在左侧的“可用包”下。

答案 1 :(得分:1)

我认为您可能希望使用View而不是Activity执行此操作。 View有一个名为onScrollChanged的方法听起来像你想要的。如果不是这样,您可能还想查看同一类的computeScrollscrollByscrollTo方法。

答案 2 :(得分:1)

尝试以下方法

@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
}

它会在滚动后为您提供最后滚动的位置和新的滚动位置。