Android 水平滚动视图-投掷后计算停止位置

Android 水平滚动视图-投掷后计算停止位置,android,horizontalscrollview,onfling,Android,Horizontalscrollview,Onfling,使用HorizontalScrollView,我如何检测用户抛出视图后滚动何时停止?或者,我如何知道当滚动停止时滚动将处于什么位置(然后我可以将其与onScrollChanged一起使用) 我继承了横向滚动视图。我想要的是,当用户与视图交互时,视图的行为自然,但当它停止更新其一些子视图时——如果我在视图滚动时这样做,则会在滚动过程中造成小的延迟 谢谢您也可以使用 使用滚动条的步骤 子类HorizontalScrollView具有自定义视图,并重写onTouchEvent方法,onIntercep

使用HorizontalScrollView,我如何检测用户抛出视图后滚动何时停止?或者,我如何知道当滚动停止时滚动将处于什么位置(然后我可以将其与onScrollChanged一起使用)

我继承了横向滚动视图。我想要的是,当用户与视图交互时,视图的行为自然,但当它停止更新其一些子视图时——如果我在视图滚动时这样做,则会在滚动过程中造成小的延迟

谢谢

您也可以使用

使用滚动条的步骤

  • 子类HorizontalScrollView具有自定义视图,并重写onTouchEvent方法,onInterceptTouchEvent方法返回false
  • 在活动中实现OnTestureListener
  • 将onFling运动事件传递给scroller方法

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

  • 可以使用以下滚动条方法:

  • getFinalX() getFinalY()


    不断扫描此isFinished()值,以查看是否结束了滚动。

    我为
    HorizontalScrollView
    编写了一个自定义类,该类具有scroll stop方法接口,在滚动停止时提供了
    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;
    }
    
    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());
        }
    });
    
    以下是
    onScrollStop()
    方法:

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

    除此之外,您还需要为水平滚动视图提供MotionEvent。@khotmanish..您有此示例代码吗?我发现很难使用它…同样的要求,我已经尝试了几乎所有的方法,如果你发现了什么,请告诉我。我已经找到了解决方案,并将上传到这里,以便其他人需要它。