• 李氏滑动事件冲突解决方案 之 处理子ViewGroup的超棒方案


      父ViewGroup(CurView) 和 子 ViewGroup(ParentView) 滑动事件冲突解决方案 之 处理子ViewGroup的超棒方案:

    子ViewGroup 以 SlipRelativeLayout 为例子:

    • 当 mEnableX=true, mEnableY=false 时, SlipRelativeLayout 中所有的 横向滑动事件都交给自己处理,横向滑动事件都交给 ParentView 处理;
    • 当 mEnableX=false, mEnableY=true 时, SlipRelativeLayout 中所有的 纵向滑动事件都交给自己处理,纵向滑动事件都交给 ParentView 处理;
    • 当 mEnableX=true, mEnableY=true 时, SlipRelativeLayout 中所有的 横向和纵向滑动事件都交给自己处理,ParentView 不处理任何事件;
    • 当 mEnableX=false, mEnableY=false 时, SlipRelativeLayout 中所有的 自己不处理任何滑动事件,所有事件都交给 ParentView 处理;
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.ViewParent;
    import android.widget.RelativeLayout;
    
    public class SlipRelativeLayout extends RelativeLayout {
    
        public static final String TAG = "SlipRelativeLayout";
    
        private boolean mEnable = false, mEnableX = true, mEnableY = false;
    
        private float xDistance, yDistance;
        private float xStart, yStart;
        private float xEnd, yEnd;
    
        public SlipRelativeLayout(@NonNull Context context) {
            super(context);
        }
    
        public SlipRelativeLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SlipRelativeLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public boolean ismEnable() {
            return mEnable;
        }
    
        public void setmEnable(boolean mEnable) {
            this.mEnable = mEnable;
        }
    
        public boolean ismEnableX() {
            return mEnableX;
        }
    
        public void setmEnableX(boolean mEnableX) {
            this.mEnableX = mEnableX;
        }
    
        public boolean ismEnableY() {
            return mEnableY;
        }
    
        public void setmEnableY(boolean mEnableY) {
            this.mEnableY = mEnableY;
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return super.onInterceptTouchEvent(ev);
    
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (null == ev) return false;//不截事件
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    xDistance = yDistance = 0f;
                    xStart = ev.getX();
                    yStart = ev.getY();
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_MOVE:
                    xEnd = ev.getX();
                    yEnd = ev.getY();
                    xDistance = xEnd - xStart;
                    yDistance = yEnd - yStart;
                    getParent().requestDisallowInterceptTouchEvent(needIntercept());
                    break;
                default:
                    break;
    
            }
            return super.dispatchTouchEvent(ev);
        }
    
        private boolean needIntercept() {
            ViewParent viewparent = getParent();
            if (null != viewparent) {
                boolean disallowIntercept;
                float distance = Math.abs(xDistance) - Math.abs(yDistance);
                if ((mEnableX && distance > 0) || (mEnableY && distance < 0) || mEnable) {//拦截X事件向下分发
                    disallowIntercept = true;
                } else {
                    disallowIntercept = false;
                }
                return disallowIntercept;
            }
            return false;
        }
    
    }
  • 相关阅读:
    Linux基本命令
    IDEA实用插件
    Windows常用快捷键
    IDEA常用快捷键
    OOP三大特性之多态
    IDEA里配置SSM框架,配置没问题却报404错误
    Tomcat的80端口被占用问题_解决方案
    基于SpringBoot开发
    java数据结构--线性表
    代码优化设计(一)
  • 原文地址:https://www.cnblogs.com/larack/p/9732745.html
Copyright © 2020-2023  润新知