事件传递机制

2017-12-14  本文已影响4人  魂之挽歌w

一般来说:Activity------>Window--------->DevorView(setContentView所设置的view)

                即Activity中的,dispatchTouchEvent()方法{

                            getWindow.superDispatchTouchEvent();}

总结:

1.事件的传递时由外层往内层传递

2.事件的消费与之相反,是内层往外层传递

ViewGroup传递:dispatchTouchEvent()---------interceptTouchEvent()--------onTouchEvent()

View :dispatchTouchEvent()-------onTouchEvent()

ViewGroup中:

dispatchTouchEvent()默认为true即默认传递

interceptTouchEvent()默认为false不拦截事件

onTouchEvent()默认为false不处理事件

View中:

dispatchTouchEvent()默认为false即默认不传递,因为没有下层传递了

且也不需要拦截,

onTouchEvent()默认为true,默认view消费事件,如果返回false,则事件往上层传递

mFirstTarget:在dispatchTouchEvent()中,当子view消费了ACtion_DOWN事件,那么给mFirstTarget赋值,否则为null

if(mFirstTarget!=null || actionMasked==MotionEvent.ACTION_DOWN){

        final boolean disallowIntercept=(**& FLAG_DISALLOW_INTERCEPT)!=0;

        if(!disallowIntercept){

                //如果允许拦截

                intercepted=onIntercepteEvent(ev);

}else  {不允许拦截的话,就不能拦截,不执行onIntercept

                    intercepted=false;}

else  {   

            如果子view不消费ACTION_DOWN事件,并且不为ACTION_DOWN事件,那么

            不往下传递,直接拦截

                  intercepted=true;    }

if(!cancel&&!intercepted){不拦截并没有取消就向下传递事件

            dispatchTransforTouchEvent

            newTouchTarget=addTouchTarget(,,,,,,)该方法中设置mFirstTarget}

上一篇下一篇

猜你喜欢

热点阅读