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);
        }
    }
  • 相关阅读:
    使用tcmalloc编译启动时宕机
    使用tcmalloc编译出现undefined reference to `sem_init'
    使用AddressSanitizer做内存分析(一)——入门篇
    VIM-美化你的标签栏
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
    Entity Framework Code First (一)Conventions
  • 原文地址:https://www.cnblogs.com/supermanChao/p/5832577.html
Copyright © 2011-2022 走看看