根据按下Button分析View的onTouch源码触摸流程

1. 说明

对于自定义View的 onTouchEvent(),一般在开发过程中,直接让其 return true即可,之前并没有说为什么这样做,这样做的目的是什么,下边来分析下onTouchEvent()的源码;

2. ViewGroup的dispatchTouchEvent()源码如下:

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

            final boolean canceled = resetCancelNextUpFlag(this)
                    || actionMasked == MotionEvent.ACTION_CANCEL;

            if (!canceled && !intercepted) {          
                            resetCancelNextUpFlag(child);
                            if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {

                                newTouchTarget = addTouchTarget(child, idBitsToAssign);
                            }
                        }                       
                    }
        return handled;
    }
    private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits) {
        final TouchTarget target = TouchTarget.obtain(child, pointerIdBits);
        target.next = mFirstTouchTarget;
        mFirstTouchTarget = target;
        return target;
    }
3. onTouch()源码触摸流程
根据按下Button分析View的onTouch源码触摸流程_第1张图片
事件分发和onTouch()源码.png
分析上图可知:当按下button控件后的事件分发

比如我按下这个控件,这个就是 Action_Down:
1>:父父布局会分发事件给父布局,父布局会分发事件给子布局,如果里边还有布局,它会一层一层的往里边去分发,分发调用dispatchTouchEvent();
2>:父布局是调用ViewGroup的dispatchTouchEvent()方法,子布局是调用View的dispatchTouchEvent()方法,而View是没有onInterceptEvent()拦截方法;


如果onTouchEvent()是:return false:

1>:ViewGroup的源码:表示dispatchTransformedTouchEvent()返回的是false,就不会调addTouchTarget()方法,那么mFirstTouchTarget是空;
2>:在Action_Move时,intercepted=true,那么if(!canceled && !intercepted)返回false,那么View的dispatchTouchEvent()方法不会执行,所以View的onTouchEvent()方法也不会执行,所以就不会处理任何所有自定义View事件;

如果onTouchEvent()是:return true:

1>:当return true时,mFirstTouchTarget就不是空,那么intercepted=false,if(!canceled && !intercepted)返回true,就会再次进到dispatchTransformTouchEvent(),就又会向下执行了,就可以处理自定义View事件了;

你可能感兴趣的:(根据按下Button分析View的onTouch源码触摸流程)