真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析

這篇文章主要介紹了Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析文章都會有所收獲,下面我們一起來看看吧。

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出武城免費(fèi)做網(wǎng)站回饋大家。

搭建最簡單的結(jié)構(gòu)

新建Activity,重寫dispatchTouchEvent和onTouchEvent,前面的方法負(fù)責(zé)點(diǎn)擊事件的分發(fā),后面的方法負(fù)責(zé)點(diǎn)擊事件的消耗,然后打印三種觸摸事件的觸發(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,還有因?yàn)長inearLayout繼承自ViewGroup,ViewGroup是可以攔截點(diǎn)擊事件的,這個很好理解,因?yàn)榭丶际欠旁谒锩娴穆?。所以還要重寫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;
  }

(這里有個重點(diǎn)).

這里有個需要注意的地方就是Android的控件有些是默認(rèn)可以點(diǎn)擊的(如Button),還有一些是默認(rèn)不可點(diǎn)擊的(如TextView)他們的分發(fā)是有一些不同的,這里我們先看不可點(diǎn)擊的,新建一個類繼承android.support.v7.widget.AppCompatTextView,兼容的TextView,同時跟Activity一樣重寫dispatchTouchEvent和onTouchEvent,代碼不貼了,跟上面一樣,它是普通控件,沒有攔截的方法。

開始點(diǎn)擊,移動手指后抬起

然后來點(diǎn)一點(diǎn)屏幕上的控件看看打印的log,dispatchTouchEvent和onTouchEvent都返回默認(rèn)的實(shí)現(xiàn)super,onInterceptTouchEvent默認(rèn)返回false,表示不攔截,默認(rèn)的情況打?。?/p>

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

這是默認(rèn)的情況,把它分為三個階段:

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,這樣來看, 組合起來真是情況太多了,寫下來挨個分析看代碼的話怕是要看暈,所以這里用一張圖來看看所有的情況:

普通不可點(diǎn)擊View的事件分發(fā)流程

Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析

默認(rèn)可點(diǎn)擊控件的事件分發(fā)

比如Button這種默認(rèn)可以點(diǎn)擊的控件,或者設(shè)置android:clickable=”true”的控件,在分發(fā)流程中有一些不同,主要是onTouchEvent的默認(rèn)方法不同,它直接消耗點(diǎn)擊事件,不再往上傳遞。

可點(diǎn)擊View的事件分發(fā)流程

Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析

關(guān)于“Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標(biāo)題:Android中點(diǎn)擊事件分發(fā)機(jī)制的原理分析
當(dāng)前URL:http://weahome.cn/article/gijjso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部