您好,登錄后才能下訂單哦!
Android中點擊事件分發(fā)機制的原理是什么,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
搭建最簡單的結(jié)構(gòu)
新建Activity,重寫dispatchTouchEvent和onTouchEvent,前面的方法負責點擊事件的分發(fā),后面的方法負責點擊事件的消耗,然后打印三種觸摸事件的觸發(fā)
private static final String TAG = MainActivity.class.getSimpleName(); @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "Activity onTouchEvent ACTION_DOWN");//按下 break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "Activity onTouchEvent ACTION_MOVE");//移動 break; case MotionEvent.ACTION_UP: Log.d(TAG, "Activity onTouchEvent ACTION_UP");//抬起 break; } return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "Activity dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "Activity dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "Activity dispatchTouchEvent ACTION_UP"); break; } return super.dispatchTouchEvent(ev); }
新建一個類繼承自LinearLayout,同樣也重寫dispatchTouchEvent和onTouchEvent,還有因為LinearLayout繼承自ViewGroup,ViewGroup是可以攔截點擊事件的,這個很好理解,因為控件都是放在他里面的嘛。所以還要重寫onInterceptTouchEvent方法
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "onInterceptTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "onInterceptTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "onInterceptTouchEvent ACTION_UP"); break; default: break; } return false; }
(這里有個重點).
這里有個需要注意的地方就是Android的控件有些是默認可以點擊的(如Button),還有一些是默認不可點擊的(如TextView)他們的分發(fā)是有一些不同的,這里我們先看不可點擊的,新建一個類繼承android.support.v7.widget.AppCompatTextView,兼容的TextView,同時跟Activity一樣重寫dispatchTouchEvent和onTouchEvent,代碼不貼了,跟上面一樣,它是普通控件,沒有攔截的方法。
開始點擊,移動手指后抬起
然后來點一點屏幕上的控件看看打印的log,dispatchTouchEvent和onTouchEvent都返回默認的實現(xiàn)super,onInterceptTouchEvent默認返回false,表示不攔截,默認的情況打印:
1.-------------------------------------- D/MainActivity: Activity dispatchTouchEvent ACTION_DOWN D/MyLayout: dispatchTouchEvent ACTION_DOWN D/MyLayout: onInterceptTouchEvent ACTION_DOWN D/MyTextView: dispatchTouchEvent ACTION_DOWN 2.-------------------------------------- D/MyTextView: onTouchEvent ACTION_DOWN D/MyLayout: onTouchEvent ACTION_DOWN D/MainActivity: Activity onTouchEvent ACTION_DOWN 3.-------------------------------------- D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE D/MainActivity: Activity onTouchEvent ACTION_MOVE D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE D/MainActivity: Activity onTouchEvent ACTION_MOVE D/MainActivity: Activity dispatchTouchEvent ACTION_UP D/MainActivity: Activity onTouchEvent ACTION_UP
這是默認的情況,把它分為三個階段:
1. 事件的分發(fā),從上到下,從Activity到Layout到Text的dispatchTouchEvent結(jié)束
2. 事件的消耗,從下到上,從Text到Layout到Activity的onTouchEvent結(jié)束
3. 這套動作的后續(xù)事件交給上個事件的最后消耗者,不經(jīng)過其他控件的分發(fā)
三個函數(shù)的其他返回值
dispatchTouchEvent和onTouchEvent都有三種返回情況
- true
- false
- super.dispatchTouchEvent(ev)和super.onTouchEvent(event)
onInterceptTouchEvent有兩種返回,true和false,這樣來看, 組合起來真是情況太多了,寫下來挨個分析看代碼的話怕是要看暈,所以這里用一張圖來看看所有的情況:
普通不可點擊View的事件分發(fā)流程
默認可點擊控件的事件分發(fā)
比如Button這種默認可以點擊的控件,或者設(shè)置android:clickable=”true”的控件,在分發(fā)流程中有一些不同,主要是onTouchEvent的默認方法不同,它直接消耗點擊事件,不再往上傳遞。
可點擊View的事件分發(fā)流程
關(guān)于Android中點擊事件分發(fā)機制的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。