֮ǰд¹ýһƪAndroid
ʼþ·Ö·¢»úÖÆÏê½â £¬¸Ð¾õ±È½ÏÂÒ£¬ÕâÀïÔÙ×ܽáһϡ£ÍøÉÏÒѾÓкܶàǰ±²·ÖÎö¹ýÔ´Â룬´ó¼Ò¿ÉÒԲο¼£¬ÎÒÕâÀᄀÁ¿²»×ö¹ý¶àµÄÔ´Âë·ÖÎö£¬½ö½ö´ÓÁ÷³ÌÉÏ·ÖÎö¡£
0x01 »ù´¡²¿·Ö ʼþ·Ö·¢ºÍÏû·ÑÎÒÃÇÖ÷񻃾¼°µ½ÒÔÏÂÈý¸ö·½·¨£º dispatchTouchEvent():·Ö·¢Ê¼þ onInterceptTouchEvent():À¹½ØÊ¼þ onTouchEvent():´¦Àíʼþ »¹ÐèҪעÒâ³£ÓõÄÁ½¸ö½Ó¿Ú¶ÔÒÔÉÏ·½·¨µÄÓ°Ï죺 OnClickListener £ºµã»÷ʼþ¼àÌý OnTouchListener £º´¥Ãþʼþ¼àÌý
×îºóÔÙÈÏʶһÏÂMotionEvent£¬Ëû±íʾÓû§µÄ´¥Ãþʼþ£¬Óû§µÄµã»÷¡¢´¥Ãþ»òÕß»¬¶¯¶¼»á²úÉúÏàÓ¦µÄMotionEvent£¬¶øÎÒÃÇËùÒª¹ØÐĵÃÖ÷ÒªÓÐÈýÖÖ£º MotionEvent.ACTION_DOWN :intÀàÐÍ£¬ÖµÎª0£¬±íʾÓû§µÄÊÖÖ¸¸Õ½Ó´¥µ½ÆÁÄ» MotionEvent.ACTION_UP :int ÀàÐÍ£¬ÖµÎª1£¬±íʾÓû§µÄÊÖÖ¸´ÓÆÁÄ»ÉÏ̧Æð MotionEvent.ACTION_MOVE :int ÀàÐÍ£¬ÖµÎª2£¬±íʾÓû§µÄÊÖÖ¸ÕýÔÚÆÁÄ»ÉÏÒÆ¶¯
ÀýÈçµ±ÎÒÃÇ´¥ÃþÆÁÄ»£¬¿ÉÄܲúÉúһϵÁеÄʼþ£º µã»÷Ò»ÏÂÆÁÄ»£¬»á²úÉúACTION_DOWN£¬ACTION_UP µã»÷ÆÁÄ»²¢»¬¶¯È»ºóËÉ¿ª£¬»á²úÉúACTION_DOWN£¬Ò»ÏµÁеÄACTION_MOVE£¬ACTION_UPʼþ¡£
µ±È»»¹ÓÐÆäËûµÄ¶¯×÷£¬ÎÒÃDz»×ö¶àµÄ½²½â£¬ÕâÈý¸ö¶¯×÷ÊÇÎÒÃÇÔÚ²Ù×÷ÊÖ»úʱ×î³£¼ûµ½µÄ£¬ÔÚ´¦Àí»¬¶¯³åÍ»Öкܹؼü£¬ÏÂÎĽ«»á½²µ½¡£
0x02 ViewµÄʼþ·Ö·¢Óë´¦Àí ÕâÀïµÄViewÒ»°ãÖ¸µÄÊÇÏñButton£¬TextViewÕâÖÖ£¬´¦ÓÚʼþ·Ö·¢µÄ×îºóÒ»¼¶¡£Ö÷Òª°üº¬dispatchTouchEventºÍonTouchEventÁ½¸ö·½·¨¡£ÎÒÃÇ×¢Òâµ½ËûûÓÐonInterceptTouchEvent·½·¨ËùÒÔÒ²¾Í²»ÐèÒªÅжÏÊÇ·ñÐèÒªÀ¹½ØÊ¼þ¡£ÎªÁË·½±ã½²½â£¬ÕâÀï¾ÙÒ»¸öСÀý×ÓÀ´¸¨Öú˵Ã÷¡£
Ê×Ïȶ¨ÒåÒ»¸öCustomButton²¢ÖØÐ´ÆädispatchTouchEventºÍonTouchEvent·½·¨£º
public class CustomButton extends AppCompatButton { String TAG = "CustomButton";
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet
attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.e(TAG, "onTouchEvent:" + "action:"
+ event.getAction());
boolean result = super.onTouchEvent(event);
Log.e(TAG, "super.onTouchEvent:result="
+ result);
return result;
}
@Override
public boolean dispatchTouchEvent(MotionEvent
event) {
Log.e(TAG, "dispatchTouchEvent:" + "action:"
+ event.getAction());
boolean result = super.dispatchTouchEvent(event);
Log.e(TAG, "super.dispatchTouchEvent:result="
+ result);
return result;
}
} |
ÔÚactivity_main²¼¾ÖÎļþÖÐʹÓøÃView£¬ÔËÐгÌÐò£¬µã»÷¸ÃViewһϣ¬µÃÒÔϽá¹û£º
CustomButton: dispatchTouchEvent:action:0 CustomButton: onTouchEvent:action:0 CustomButton: super.onTouchEvent:result=true CustomButton: super.dispatchTouchEvent:result=true CustomButton: dispatchTouchEvent:action:1 CustomButton: onTouchEvent:action:1 CustomButton: super.onTouchEvent:result=true CustomButton: super.dispatchTouchEvent:result=true |
´ÓÉϱߵÄÈÕÖ¾¿ÉÒԵóö£º 1.dispatchTouchEvent»áÏÈÓÚonTouchEvent·½·¨»Øµ÷¡£ 2.¶ÔÓڸõã»÷¶¯×÷£¬ÏÈ´¦ÀíactionΪ0£¬ºó´¦ÀíactionΪ1µÄʼþ¡£ÉÏÎÄÖн²µ½ÁË0ÊÇMotionEvent.ACTION_DOWNʼþ,1ÊÇMotionEvent.ACTION_UPʼþ¡£
3.ĬÈÏÇé¿öÏÂdispatchTouchEventºÍonTouchEvent·½·¨¶¼·µ»ØµÄtrue¡£Õâ±íʾ¸ÃView½«ÒªÏû·ÑÕâЩ½ÓÊÕµ½µÄʼþ
ÔĶÁ¹ýÔ´ÂëµÄͬѧӦ¸ÃÖªµÀ£¬¸ÃViewµÄ¸¸ViewGroup½«Ê¼þ·Ö·¢µ½Ëü£¬Ò²¾ÍÊǻص÷¸ÃViewµÄdispatchTouchEvent·½·¨¡£Ô´ÂëÖÐÒª´¦ÀíµÄÊÂÇéºÜ¶à£¬ÕâÀï¾Í²»ÏêϸµÄ½éÉÜÁË£¬µ±È»»¹ÊÇÏ£ÍûÓÐÐËȤµÄͬѧȥÔĶÁÒ»ÏÂÔ´ÂëµÄ¡£ViewµÄdispatchTouchEventµÄ·½·¨±»»Øµ÷ʱҲ¾ÍÊÇʼþ±»½»¸øView´¦ÀíÁË£¬Ëü¿ÉÒÔÑ¡ÔñÈ¥´¦ÀíÏû·ÑÕâЩʼþ£¬Ò²¿ÉÒÔÑ¡Ôñ²»È¥Ïû·Ñ£¨onTouchEvent·µ»Øfalse£©¡£Èç¹û·µ»ØfalseÄÇôËüÓֻὫʼþ´«µÝ¸ø¸¸ViewGroupÕâÊǺ󻰡£
½ÓÏÂÀ´ÎÒÃÇÌÖÂÛOnTouchListener£¬OnClickListenerµÄÓ°Ïì¡£ÎÒÃÇÔÚMainActivityÖиøCustomButtonÉèÖÃһϼàÌý£º
public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomButton cb = (CustomButton) findViewById(R.id.btn_1);
cb.setOnClickListener(this);
cb.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
Log.e("onTouch", "onTouch:action:"+event.getAction());
return false;
}
@Override
public void onClick(View v) {
Log.e("onClick", "Button click");
}
} |
ÔÙµã»÷Ò»ÏÂCustomButton»áµÃµ½ÒÔÏÂLog:
CustomButton: dispatchTouchEvent:action:0 onTouch: onTouch:action:0 CustomButton: onTouchEvent:action:0 CustomButton: dispatchTouchEvent:action:1 onTouch: onTouch:action:1 CustomButton: onTouchEvent:action:1 onClick: Button click |
¿ÉÒÔ¿´³öÖ´ÐÐ˳ÐòΪdispatchTouchEvent->onTouch->onTouchEvent->onClick£¬´ËʱonTouch·½·¨·µ»ØµÄΪfalse£¬Ò²¾ÍÊDZíʾËü²»»á´¦ÀíÕâЩʼþ¡£ÄÇôÎÒÃǽ«onTouch·½·¨·µ»ØÎªtrueÔÚÖØ¸´ÉϱߵIJÙ×÷»áµÃµ½Ê²Ã´½á¹ûÄØ£¿
CustomButton: dispatchTouchEvent:action:0 onTouch: onTouch:action:0 CustomButton: dispatchTouchEvent:action:1 onTouch: onTouch:action:1 |
Ö´Ðнá¹ûdispatchTouchEvent->onTouch¡£¿ÉÒÔ¿´µ½onTouchEventºÍonClickûÓÐÖ´ÐС£Òª½âÊÍÇå³þÕâ¸ö¾Í±ØÐë¿´¿´Ô´ÂëÁË¡£Ï±ßÊÇÎÒÕûÀíµÄView.dispatchTouchEvent()·½·¨µÄ²¿·ÖÔ´Â룺
public boolean dispatchTouchEvent(MotionEvent event) { ...... boolean result = false; ...... //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { result = true; }
if (!result && onTouchEvent(event))
{
result = true;
}
......
return result;
} |
×îÖ÷ÒªµÄ¾ÍÊÇifµÄÅжÏÌõ¼þ
li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event) |
Èç¹ûÎÒÃÇÉèÖÃÁËOnTouchListener¼àÌý£¬ÄÇôli != null && li.mOnTouchListener
!= null ¾ÍΪtrue£¬´ËʱÅжÏÌõ¼þ¿ÉÒÔ¼ò»¯Îª
true&& (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event) |
½ÓÏÂÀ´»áÅжÏViewÊÇ·ñÊÇENABLEDµÄ£¨ÔÚxmlÎļþÖкʹúÂëÖж¼¿ÉÒÔÉèÖÃenableÊôÐÔ£©¡£´Ó´úÂëÖÐÈç¹ûÉèÖøÃÊôÐÔΪfalseÄÇôonTouch£¨onClickÒ²²»»á£¬¿ÉÒÔ×Ô¼º¿´Ô´Â룩·½·¨½«²»»á»Øµ÷£¬Ò²¾ÍÊÇÉèÖÃOnTouchListener£¨OnClickListener£©¼àÌý½«Ê§Ð§£¡
µ«ÊÇҪעÒ⣬¸ù¾ÝÏÂÒ»¾ä´úÂëonTouchEvent»¹ÊÇ¿ÉÒԻص÷µÄ¡£Èç¹û²»ÉèÖøÃÊôÐÔ£¬Ä¬ÈÏÊÇtrueµÄ£¬ÄÇôÅжÏÌõ¼þÓÖ¿ÉÒÔ¼ò»¯
true&&true&&li.mOnTouchListener.onTouch(this, event) |
´Ëʱ¾ÍºÜÇå³þÁË£¬Èç¹ûonTouch()·µ»ØfalseÄÇôresult¾ÍΪfalse¡£
if (!result && onTouchEvent(event)) { result = true; } |
onTouchEvent()¾Í»á»Øµ÷£¬²¢ÇÒ»¹»áµ¼ÖÂdispatchTouchEvent·½·¨µÄ·µ»ØÖµºÍonTouchEvent()·½·¨Ïàͬ¡£Ïà·´Èç¹ûonTouch()·µ»ØÎªtrueÄÇôonTouchEvent()·½·¨¾ÍûÓа취ִÐÐÁË¡£ËùÒÔonTouchEvent()Äܲ»ÄÜÖ´Ðл¹µÃ¿´onTouch()·½·¨µÄ·µ»ØÖµ¡£
×¢Ò⣺ViewµÄÕâÏ»ص÷·½·¨µÄÓÅÏȼ¶·Ç³£ÖØÒª£¬Îñ±Ø¸ãÇå³þ£¬dispatchTouchEvent->onTouch->onTouchEvent->onClick¡£²»½öÈç´Ë£¬»¹µÃ·Ç³£Çå³þÿ¸ö·½·¨·µ»ØÖµµÄ½á¹û¶ÔÕû¸öʼþÁ÷µÄÓ°Ïì¡£
ÏÂͼÊÇ×Ô¼º»µÄViewʼþ·Ö·¢µÄÒ»²¿·ÖÁ÷³Ìͼ£¬Ï£ÍûÄܰïæÀí½â£º

0x03 ViewGroupʼþ·Ö·¢ ÉÏÎĽéÉÜÁËViewµÄ·Ö·¢£¬ÓÉÓÚViewÒ»°ãÊÇÔÚʼþ·Ö·¢ÖеÄ×îºóÒ»²ã£¬ËùÒÔÏà¶Ô¶øÑÔÒª¼òµ¥Ò»Ð©£¬µ«ÊÇViewGroup¾ÍÒª¸´ÔÓ¶àÁË¡£ÎÒÃÇÒ»°ãÓõıȽ϶àµÄViewGroup¾ÍÊÇRelativeLayout,LinearLayoutµÈ³£Óò¼¾Ö¡£ÒòΪÕâЩ²¼¾ÖºÜ¿ÉÄÜ»á°üº¬ÆäËûView£¬ËùÒÔ³ýÁËdispatchTouchEvent(),onTouchEvent()Ö®Í⻹¶àÁËÒ»¸öonInterceptTouchEvent()ÓÃÀ´À¹½ØÊ¼þ¡£ÎÒÃÇ»¹ÊǼòµ¥µÄ×Ô¶¨ÒåViewGroupOne£¬ViewGroupTwo£¬ViewGroupThree¼Ì³Ð×ÔLinearLayout¡£
public class ViewGroupOne extends LinearLayout { private final String TAG = "ViewGroupOne";
public ViewGroupOne(Context context) {
super(context);
}
public ViewGroupOne(Context context, @Nullable
AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent
ev) {
Log.e(TAG, "dispatchTouchEvent:" + "action:"
+ ev.getAction());
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent
ev) {
Log.e(TAG, "onInterceptTouchEvent:"
+ "action:" + ev.getAction());
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.e(TAG, "onTouchEvent:" + "action:"
+ ev.getAction());
return super.onTouchEvent(ev);
}
} |
È»ºó°´ÕÕÏÂͼ½øÐÐǶÌ×ʹÓ㺠
µã»÷CustomButton¿ÉÒԵõ½ÒÔÏÂÐÅÏ¢£º
ViewGroupOne: dispatchTouchEvent:action:0 ViewGroupOne: onInterceptTouchEvent:action:0 ViewGroupTwo: dispatchTouchEvent:action:0 ViewGroupTwo: onInterceptTouchEvent:action:0 ViewGroupThree: dispatchTouchEvent:action:0 ViewGroupThree: onInterceptTouchEvent:action:0 CustomButton: dispatchTouchEvent:action:0 CustomButton: onTouchEvent:action:0 ViewGroupOne: dispatchTouchEvent:action:1 ViewGroupOne: onInterceptTouchEvent:action:1 ViewGroupTwo: dispatchTouchEvent:action:1 ViewGroupTwo: onInterceptTouchEvent:action:1 ViewGroupThree: dispatchTouchEvent:action:1 ViewGroupThree: onInterceptTouchEvent:action:1 CustomButton: dispatchTouchEvent:action:1 CustomButton: onTouchEvent:action:1 |
ĬÈÏÇé¿öÏ£¬CustomButtonÊÇÏû·ÑʼþµÄ£¬ÕâÖÖÇé¿öϵķַ¢»¹ÊǺÜÇåÎúµÄ¡£ 
µ±Ê¼þ´«µÝµ½ViewGroupOneÖ®ºóÏȻص÷dispatchTouchEvent£¬Ôڸ÷½·¨Öлáµ÷ÓÃonInterceptTouchEvent·½·¨À´ÅжÏÊÇ·ñÀ¹½ØÊÖÊÆ£¬ÕâÀïĬÈÏÊDz»À¹½ØµÄ£¬ÄÇô»á¼ÌÐø´«µÝµ½ViewGroupTwo²¢µ÷ÓÃÆädispatchTouchEvent·½·¨£¬½ÓÏÂÀ´¾ÍºÍViewGroupOneÒ»ÑùµÄÁ÷³Ì£¬Ö±µ½´«µÝµ½View£¨CustomButton£©²¢Ïû·Ñ¸Ãʼþ£¨onTouchEvent·µ»Øtrue£©¡£ÄÇôÎÒÃÇÔÙÀ´¿´¿´µ±View£¨CustomButton£©²»Ïû·Ñʼþ(onTouchEvent·µ»Øfalse)ʱÊÇʲôÑù£º
ViewGroupOne: dispatchTouchEvent:action:0 ViewGroupOne: onInterceptTouchEvent:action:0 ViewGroupTwo: dispatchTouchEvent:action:0 ViewGroupTwo: onInterceptTouchEvent:action:0 ViewGroupThree: dispatchTouchEvent:action:0 ViewGroupThree: onInterceptTouchEvent:action:0 CustomButton: dispatchTouchEvent:action:0 CustomButton: onTouchEvent:action:0 ViewGroupThree: onTouchEvent:action:0 ViewGroupTwo: onTouchEvent:action:0 ViewGroupOne: onTouchEvent:action:0 |
Õâ´ÎµÄ½á¹ûÔÚʼþ·Ö·¢µÄʱÁ÷³Ì´óÌåÒ»Ñù£¬µ«ÊÇÒ²ÓкÍÉÏÒ»´ÎµÄÓкܴóµÄ²»Í¬µÄµØ·½£º 1.Ö»ÓÐMotionEvent.ACTION_DOWNµÄʼþ 2.onTouchEventÓÉViewGroupThreeµ½ViewGroupOneÒÀ´ÎÖ´ÐС£ ¶ÔÓÚµÚÒ»µãÊÇÒòΪÎÒÃǽ«CustomViewµÄonTouchEventµÄ·µ»ØÖµÐÞ¸ÄΪfalse£¬Ò²¾ÍÊÇCustomView²»Ïû·Ñ´Ëʼþ£¬¶øÄ¬ÈÏÇé¿öÏÂViewGroupÒ²²»Ïû·Ñ£¨onTouchEvent·µ»Øfalse£©£¬ËùÒÔ¾ÍûÓÐÈËÏû·ÑʼþÁË£¬ÄÇôºó±ßµÄʼþÒ²¾Í²»ÔÙ´¦ÀíÁË¡£
¶ÔÓÚ¶Ô¶þµãʼþµÄÏû·ÑºÍ֮ǰµÄ·Ö·¢Á÷³ÌÖÁ¸¸µ½×Ó´«µÝ¹ý³Ì²»Í¬£¬ËüÊÇ´Ó×Óµ½¸¸´«µÝ£¬Ò²¼´¶ÔÓÚ×Ô¼º²»´¦ÀíµÄʼþ£¬»á´«µÝ¸ø¸¸²¼¾ÖÈÃÆä´¦Àí£¬ÒÔ´ËÀàÍÆ¡£Ö±µ½´«µÝµ½ÓÐÈË´¦Àí»òÕßѹ¸ù¾ÍûÈË´¦Àí¾ÍºÍÉϱߵÄÇé¿öÒ»Ñù¡£

Éϱ߽²Á˰ëÌ춼ûÓмûµ½onInterceptTouchEvent()Õâ¸ö·½·¨ÓÐʲôÓã¬ÏÖÔÚÎÒÃÇÑ¡Ôñ½«ViewGroupTwoµÄonInterceptTouchEvent()·µ»ØÖµ´ÓĬÈϵÄfalse¸ÃΪtrue¡£¿´¿´³ÌÐòÖ´Ðнá¹û£º
ViewGroupOne: dispatchTouchEvent:action:0 ViewGroupOne: onInterceptTouchEvent:action:0 ViewGroupTwo: dispatchTouchEvent:action:0 ViewGroupTwo: onInterceptTouchEvent:action:0 ViewGroupTwo: onTouchEvent:action:0 ViewGroupOne: onTouchEvent:action:0 |
½á¹ûºÜÃ÷ÏÔViewGroupThreeºÍCustomButtonµÄ·½·¨¶¼Ã»Óлص÷£¨ÆäʵÊÕµ½ÁËÒ»¸öACTION_CANCELµÄʼþ£©£¬Õâ¾ÍÊÇinterceptµÄÒâÒåËùÔÚ£¬Ö±½ÓÔÚViewGroupTwoÕâÒ»²ã½«Ê¼þÀ¹½ØÁË£¬È»ºóÖ±½Ó½»ÓÉViewGroupTwoµÄonTouchEvent´¦Àí¡£

Èç¹ûViewGroupTwoµÄonTouchEventÏû·Ñʼþ£¨·µ»Øtrue£©ÄÇô´¥Ãþ²úÉúµÄһϵÁÐʼþ¶¼½«´«µÝµ½ViewGroupTwoµÄonTouchEventÖнøÐÐÏû·Ñ£¬²¢ÇÒ²»»áÔÙÏòÉÏ´«µÝ¸øViewGroupOneµÄonTouchEvent£º
ViewGroupOne: dispatchTouchEvent:action:0 ViewGroupOne: onInterceptTouchEvent:action:0 ViewGroupTwo: dispatchTouchEvent:action:0 ViewGroupTwo: onInterceptTouchEvent:action:0 ViewGroupTwo: onTouchEvent:action:0 ViewGroupOne: dispatchTouchEvent:action:1 ViewGroupOne: onInterceptTouchEvent:action:1 ViewGroupTwo: dispatchTouchEvent:action:1 ViewGroupTwo: onTouchEvent:action:1 |
ÒÔÉϽá¹ûÓ¡Ö¤ÉϱߵķÖÎö¡£ÈçÏÂͼÀ´±íʾ¸ÃÁ÷³Ì£º

×îºóÔÚÇ¿µ÷Ò»ÏÂOnTouchListenerºÍOnClickListener¶Ô·Ö·¢Á÷³ÌºÍʼþÏû·ÑµÄÓ°Ïì¡£Èç¹ûÔĶÁViewGroup.dispatchTouchEvent·½·¨Ô´Âë²»ÄѵóöÓÅÏȼ¶£º
dispatchTouchEvent->onInterceptTouchEvent->onTouch->onTouchEvent->onClick
Ò²¾ÍÊÇ˵OnTouchListener²»»á¶Ôdispatch·Ö·¢¹ý³Ì²úÉúÓ°Ï죬¶ø»áÓ°ÏìʼþµÄÏû·Ñ£¬ÒòΪÔÚ·ÖÎöViewʱÒѾ½²¹ýÁË£¬Èç¹ûÉèÖÃÁËOnTouchListener¼àÌý£¬²¢ÇÒÔÚonTouch·½·¨ÖнøÐÐʼþÏû·Ñ£¨·µ»Øtrue£©µÄ»°£¬½«²»»áÔٻص÷¶ÔÓ¦ViewµÄonTouchEvent·½·¨¡£´ó¼Ò¿ÉÒÔµ×ÏÂÊÔÑéһϣ¬ÕâÀïÆª·ùÔÒò²»ÔÙ¸ø³öÁË¡£
0x04 ActivityµÄʼþ·Ö·¢
±¾À´²»Ïë½²ActivityµÄʼþ·Ö·¢µÄ£¬ÒòÎªÒªÉæ¼°µ½WMS±È½Ï¸´ÔÓ£¬²»¹ýÏëÕæÕýÀí½âAndroidµÄʼþµÄ·Ö·¢ÕâÒ»¿é»¹ÕæµÄÈÆ²»¹ý¡£ÒòΪÉÏÎÄÖеÄʼþÁ÷¶¼ÊÇÀ´Ô´×ÔActivityµÄ¡£²»¹ýÎÒ»¹ÊDz»ÉîÈëÔ´Â룬Èç¹û¶ÔÔ´Âë¸ÐÐËȤ¿ÉÒԲο¼Android
FrameWork¡ª¡ªTouchʼþÅÉ·¢¹ý³ÌÏê½â¡£ ÎÒÃǶ¼ÖªµÀͨ³£µÄActivityµÄUI¿ò¼Ü£¬ÀàËÆÏÂͼ£º 
Èç¹ûÁ˽â¹ýAMS»úÖÆÎÒÃǾÍÖªµÀ£¬Activityʵ¼Ê²¢²»»áÈ¥¿ØÖÆUIÊÓͼ£¬ËüÖ÷ÒªÊÇÈ¥¿ØÖÆÉúÃüÖÜÆÚºÍ´¦Àíʼþ¡£ÕæÕýµÄÊÓͼ¿ØÖÆÊÇWindow¡£Window´ú±íÒ»¸ö´°¿Ú£¬Ëü³ÖÓÐÒ»¸öDecorView£¬Õâ¸öDecorView¼Ì³Ð×ÔFrameLayout£¬ËüÊÇActivityµÄ¸ù²¼¾Ö¡£¶øËûµÄÄÚ²¿Í¨³£ÓÖ°üº¬Ò»¸öLinearLayout£¬Õâ¸öLinearLayoutÓаüÀ¨titleºÍidΪcontentµÄ²¿·Ö£¨µ±È»Õâ¸öÒ²ºÍAndroidϵͳ°æ±¾ºÍÄãÉèÖõÄstyleÓйØÏµ£©¡£ÎÒÃÇÔÚActivityÖе÷ÓÃsetContentView()ÉèÖõIJ¼¾Ö¾ÍÊDZ»Ìí¼Óµ½content²¿·ÖÁË¡£Android¸øÎÒÌṩÁË·½±ã»ñÈ¡content¶ÔÓ¦²¼¾ÖµÄ·½Ê½£¬Ö»ÐèÒªµ÷ÓÃViewGroup
content=(ViewGroup)findViewById(R.android.id.content)¼´¿É¡£
ÔÚWindowManager(WindowManagerImpl)ÌåϵÖУ¬ÓÐÒ»¸öViewRoot(ViewRootImpl)ËüÊÇÁ¬½ÓWindowManagerServiceºÍDecorViewµÄŦ´ø
£¬ViewµÄÈý´óÁ÷³Ì(²âÁ¿£¨measure£©£¬²¼¾Ö£¨layout£©£¬»æÖÆ£¨draw£©)¾ùͨ¹ýViewRootÀ´Íê³É¡£ViewRoot
ʵÏÖÁËViewParent½Ó¿Ú£¬ÕâÈÃËü¿ÉÒÔ×÷ΪViewµÄÃûÒåÉϵĸ¸ÊÓͼ ¡£RootView¼Ì³ÐÁËHandlerÀ࣬¿ÉÒÔ½ÓÊÕʼþ²¢·Ö·¢£¬AndroidµÄËùÓд¥ÆÁʼþ¡¢°´¼üʼþ¡¢½çÃæË¢ÐµÈʼþ¶¼ÊÇͨ¹ýViewRoot½øÐзַ¢µÄ¡£ViewRoot¿ÉÒÔ±»Àí½âΪ¡°ViewÊ÷µÄ¹ÜÀíÕß¡±¡ª¡ªËüÓÐÒ»¸ömView³ÉÔ±±äÁ¿£¬Ö¸ÏòµÄ¾ÍÊÇDecorView¡£
¼òµ¥µã˵µ±Óд¥Ãþʼþ²úÉú£¬»áͨ¹ýWMS´«µÝµ½ViewRoot£¬ViewRootÔÙ·Ö·¢¸ø¶ÔÓ¦µÄDecorView£¨FrameLayoutËüÊÇÒ»¸öViewGroup£©£¬ÔÙ°´ÕÕÉÏÎÄViewGroupµÄ·Ö·¢»úÖÆ£¬ÏòÏÂÒÀ´Î´«µÝ£¬×îÖջᴫµÝµ½ÎÒÃÇsetContentView()ÉèÖò¼¾ÖµÄ¸ù²¼¾Ö£¬½ÓÏÂÀ´¾ÍÊÇÎÒÃÇÉÏÎÄÒѾÊìϤµÄÁ÷³ÌÁË¡£

ÕÆÎÕÁËÕâЩ£¬ÔÚ¿ª·¢ÖÐÓöµ½µÄºÜ¶àÊÖÊÆ³åÍ»µÄÎÊÌâ¾ÍÖªµÀ²úÉú³åÍ»µÄÔÒòºÍ½â¾ö³åÍ»µÄ˼·ÁË¡£ |