Android读书笔记----滑动冲突的解决方式

一、处理冲突的解决思路
根据滑动的特征来判断事件交给谁处理:是水平还是竖直滑动,可以根据两点之间的坐标,以及方向来判断,方向可以根据滑动路径和水平方向的夹角来判断(以左侧为正方向,向右侧滑动为180 左侧滑动为0度)
二,根据业务来判断:
某种情况下,需要某一个View来拦截事件。
三、处理拦截的方式
外部拦截法

Action_Down方法不能拦截,因为一旦拦截了 整个事件都会交给父级容器处理,所以只判断Move事件是否拦截即可。


    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercept = false;
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                intercept=false;
                break;
            case MotionEvent.ACTION_MOVE:
                if (如果父级容器需要该事件) {
                    intercept=true;
                }else {
                    intercept=false;
                }
                break;
            case MotionEvent.ACTION_UP:
                intercept=false;
                break;
            mLastXIntercepet=x;
            mLaSTYIntercepet=y;
            return intercept;
        }

外部拦截法
事件的拦截由子View处理。

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean intercept = false;
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);//一旦设置为true表示有子view处理事件不拦截
                break;
            case MotionEvent.ACTION_MOVE:
                int deltaX=x-mLastXIntercepet;
                int deltaY=y-mLaSTYIntercepet;
                if(父容器需要拦截此次事件){
                getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:

                break;
            mLastXIntercepet=x;
            mLaSTYIntercepet=y;
            return super.dispatchTouchEvent(event);
            }

父容器也要做修改

action-down事件 返回为false

因为requestDisallowInterceptTouchEvent不能影响action-down事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值