Horizo​​ntalScrollView - 计算后的停止位置

时间:2011-03-14 07:32:03

标签: android horizontalscrollview onfling

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

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

由于

2 个答案:

答案 0 :(得分: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());
    }
});

答案 1 :(得分:2)

您可以使用scroller作为相同内容。

使用滚动条的步骤。

  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. 可以使用以下滚动方法:

  5. getFinalX() getFinalY()

    OR

    不断扫描此isFinished()值以查找投掷是否结束。