zoukankan      html  css  js  c++  java
  • SwipeMenuListView在ScrollView里上下滑动导致菜单不能显示完全的bug解决方法

    这是因为上下滑动的时候,事件被ScrollView截获了,这时候应该禁止ScrollView截获上下滑动事件,解决方法如下

    public class NoRollSwipeMenuListView extends SwipeMenuListView {
    
        private GestureDetector mGestureDetector;
    
        public NoRollSwipeMenuListView(Context context) {
            super(context);
            mGestureDetector = new GestureDetector(context, onGestureListener);
        }
    
        public NoRollSwipeMenuListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mGestureDetector = new GestureDetector(context, onGestureListener);
        }
    
        public NoRollSwipeMenuListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mGestureDetector = new GestureDetector(context, onGestureListener);
        }
    
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            boolean b = mGestureDetector.onTouchEvent(ev);
    //        LogUtil.w("onTouchEvent", "mGestureDetector.onTouchEvent(ev)->" + b);
            return super.onTouchEvent(ev);
        }
    
        private GestureDetector.OnGestureListener onGestureListener = new GestureDetector.SimpleOnGestureListener() {
    
            //distanceX 左右滑动距离,左滑动正值,右滑动负值
            //distanceY 上下滑动距离,上滑动正值,下滑动负值
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                if (Math.abs(distanceY) >= Math.abs(distanceX)) {//上下滑动距离大于左右滑动距离,当作上下滑动
    //                LogUtil.w("onScroll", "distanceX=" + distanceX + ":distanceY=" + distanceY);
    //                LogUtil.w("onScroll", "true");
                    //上下滑动不做任何操作,在这里父ScrollView已经交出onTouch权限,否则如果权限在父ScrollView的话这里接收不到事件
                    //所以执行到这里是因为下面的setParentScrollAble(false);已经执行过了
                    return true;
                }
                //当滑动NoRollSwipeMenuListView的时候,让父ScrollView交出onTouch权限,也就是让父ScrollView停住不能滚动
                setParentScrollAble(false);
    //            LogUtil.w("onScroll", "false");
                return false;
            }
        };
    
        /**
         * 是否把滚动事件交给父ScrollView
         *
         * @param flag
         */
        private void setParentScrollAble(boolean flag) {
            //这里的parentScrollView就是NoRollSwipeMenuListView外面的那个ScrollView
    //        LogUtil.w("setParentScrollAble", "flag->" + flag);
            getParent().requestDisallowInterceptTouchEvent(!flag);
        }
    }
  • 相关阅读:
    软件测试 -- 在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题?
    软件测试 -- 测试中的“杀虫剂怪事”是指什么?
    软件测试 -- 配置和兼容性测试的区别
    软件测试 -- 和用户共同测试(UAT测试)的注意点有哪些
    软件测试 -- 测试人员和QA的区别
    软件测试 -- 所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?
    软件测试 -- 发现的缺陷越多,说明软件缺陷越多吗?
    软件测试 -- 软件测试的风险主要体现在哪里
    软件测试 -- 什么是软件测试以及软件测试的目的是什么
    微信公众平台开发
  • 原文地址:https://www.cnblogs.com/supermanChao/p/5832577.html
Copyright © 2011-2022 走看看