3

使用Horizo​​ntalScrollView,我如何检测用户在滚动视图后何时停止滚动?或者,我如何知道滚动停止时的位置(然后我可以将它与 onScrollChanged 一起使用)。

我继承了 Horizo​​ntalScrollView。我想要的是让视图在用户与其交互时表现自然,但是当它停止更新它的一些子视图时——如果我在视图滚动时这样做,它会在滚动过程中导致小的滞后。

谢谢

4

2 回答 2

3

我编写了一个自定义类,HorizontalScrollView它有一个带有滚动停止方法的接口,它给出了scrollX滚动停止时的位置。这是代码:

public class CustomMCSDHorizontalScroll extends HorizontalScrollView {

    private Runnable scrollerTask;
    private int initialPosition;
    private int newCheck = 100;


    public interface onScrollStopedListner{
        void onScrollStoped();
    }

    private onScrollStopedListner onScrollStoped;

    public CustomMCSDHorizontalScroll(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        scrollerTask = new Runnable() {
            @Override
                public void run() {
                    // TODO Auto-generated method stub
                    int newPosition = getScrollX();

                    if ( initialPosition - newPosition == 0 ) {
                        if ( onScrollStoped != null ) {
                            onScrollStoped.onScrollStoped();
                        }
                    } else {
                        initialPosition = getScrollX();
                        CustomMCSDHorizontalScroll.this.postDelayed(
                            scrollerTask, newCheck);
                    }

                }
        };
    }

    public void setOnScrollStopListner (CustomMCSDHorizontalScroll.
            onScrollStopedListner listener) {
        onScrollStoped = listener;
    }

    public void startScrollerTask(){
        initialPosition = getScrollX();
        CustomMCSDHorizontalScroll.this.postDelayed(scrollerTask, newCheck);
    }

}

这是ontouch()方法:

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch (v.getId()) {
        case R.id.mHorizontalScrollViewMain:
            if (event.getAction() == KeyEvent.ACTION_UP) {
                hsvUpperTab.startScrollerTask();
            }
            break;
        case R.id.mHorizontalScrollViewSub:
            if (event.getAction() == KeyEvent.ACTION_UP) {
                hsvLowerTab.startScrollerTask();
            }
        default:
            break;
    }
    return false;
}

这是onScrollStop()方法:

hsvLowerTab.setOnScrollStopListner(new onScrollStopedListner() {
    @Override
    public void onScrollStoped() {
        // TODO Auto-generated method stub
        getLowerTabScrolled(hsvLowerTab.getScrollX());
    }
});

hsvUpperTab.setOnScrollStopListner(new onScrollStopedListner() {
    @Override
    public void onScrollStoped() {
        // TODO Auto-generated method stub
        getUpperTabScrolled(hsvUpperTab.getScrollX());
    }
});
于 2012-09-14T07:18:19.527 回答
2

您可以使用滚动条

使用滚动条的步骤。

  1. 子类 Horizo​​ntalScrollView 以具有自定义视图并覆盖 onTouchEvent、onInterceptTouchEvent 方法以返回 false。
  2. 在活动中实现 OnGestureListener。
  3. 将 onFling 运动事件传递给滚动条方法

    fling(int startX,int startY,int velocityX,int velocityY,int minX,int maxX,int minY,int maxY)

  4. 可以使用以下滚动条方法:

getFinalX() getFinalY()

或者

不断地扫描这个 isFinished() 值以查找是否结束。

于 2011-03-14T07:54:46.660 回答