zoukankan      html  css  js  c++  java
  • 解决ScrollView嵌套viewpager滑动事件冲突问题

    重写ScrollView

    第一种方案能解决viewpager的滑动问题,但是scrollView有时会滑不动

    public class VerticalScrollView extends ScrollView {
    
        private GestureDetector mGestureDetector;
    
        public VerticalScrollView(Context context, AttributeSet attrs){
            super(context, attrs);
            mGestureDetector = new GestureDetector(context, new YScrollDetector());
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
        }
    
        class YScrollDetector extends SimpleOnGestureListener {
    
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                /**
                 * if we're scrolling more closer to x direction, return false, let subview to process it
                 */
                HBLog.i("VerticalScrollView", distanceY+"----"+distanceX);
                return (Math.abs(distanceY) > Math.abs(distanceX));
            }
        }
    
    }

    第二种方案能够解决上面的问题

    public class VerticalScrollView extends ScrollView {
    
        private float xDistance, yDistance, xLast, yLast; 
    
        public VerticalScrollView(Context context) { 
            super(context); 
        } 
    
        public VerticalScrollView(Context context, AttributeSet attrs) { 
            super(context, attrs); 
        } 
    
        public VerticalScrollView(Context context, AttributeSet attrs, int defStyle) { 
            super(context, attrs, defStyle); 
        } 
    
        @Override 
        public boolean onInterceptTouchEvent(MotionEvent ev) { 
            switch (ev.getAction()) { 
            case MotionEvent.ACTION_DOWN: 
                xDistance = yDistance = 0f; 
                xLast = ev.getX(); 
                yLast = ev.getY(); 
                break; 
            case MotionEvent.ACTION_MOVE: 
                final float curX = ev.getX(); 
                final float curY = ev.getY(); 
    
                xDistance += Math.abs(curX - xLast); 
                yDistance += Math.abs(curY - yLast); 
                xLast = curX; 
                yLast = curY; 
    
                if (xDistance > yDistance) { 
                    return false; 
                } 
            }
            return super.onInterceptTouchEvent(ev); 
        }
    
    }
  • 相关阅读:
    BERT安装与使用
    32(2).层次聚类---BIRCH
    32(1).层次聚类---AGNES
    31(2).密度聚类---Mean-Shift算法
    31(1).密度聚类---DBSCAN算法
    linux环境变量
    Linux 中“一切都是文件”概念和相应的文件类型
    Linux 服务器如何禁止 ping 以及开启 ping
    如何用3个月零基础入门机器学习?
    28款GitHub最流行的开源机器学习项目
  • 原文地址:https://www.cnblogs.com/kelina2mark/p/5238095.html
Copyright © 2011-2022 走看看