成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android中點(diǎn)擊事件分發(fā)機(jī)制的原理是什么-創(chuàng)新互聯(lián)

Android中點(diǎn)擊事件分發(fā)機(jī)制的原理是什么,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、光明網(wǎng)站維護(hù)、網(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");//移動(dòng)
        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);
  }

新建一個(gè)類繼承自LinearLayout,同樣也重寫dispatchTouchEvent和onTouchEvent,還有因?yàn)長inearLayout繼承自ViewGroup,ViewGroup是可以攔截點(diǎn)擊事件的,這個(gè)很好理解,因?yàn)榭丶际欠旁谒锩娴穆铩K赃€要重寫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;
  }

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

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

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

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

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)的情況,把它分為三個(gè)階段:

1. 事件的分發(fā),從上到下,從Activity到Layout到Text的dispatchTouchEvent結(jié)束

2. 事件的消耗,從下到上,從Text到Layout到Activity的onTouchEvent結(jié)束

3. 這套動(dòng)作的后續(xù)事件交給上個(gè)事件的最后消耗者,不經(jīng)過其他控件的分發(fā)

三個(gè)函數(shù)的其他返回值

dispatchTouchEvent和onTouchEvent都有三種返回情況
- true
- false
- super.dispatchTouchEvent(ev)和super.onTouchEvent(event)

onInterceptTouchEvent有兩種返回,true和false,這樣來看, 組合起來真是情況太多了,寫下來挨個(gè)分析看代碼的話怕是要看暈,所以這里用一張圖來看看所有的情況:

普通不可點(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)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)頁標(biāo)題:Android中點(diǎn)擊事件分發(fā)機(jī)制的原理是什么-創(chuàng)新互聯(lián)
分享鏈接:http://jinyejixie.com/article14/ddegde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作軟件開發(fā)、網(wǎng)頁設(shè)計(jì)公司、商城網(wǎng)站、網(wǎng)站排名、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
兴和县| 东安县| 常山县| 扎兰屯市| 定襄县| 通渭县| 绥中县| 神农架林区| 大冶市| 南陵县| 将乐县| 五大连池市| 利川市| 和林格尔县| 郎溪县| 鄂托克旗| 屏边| 大渡口区| 闽侯县| 花莲县| 秭归县| 麻阳| 孟州市| 鄂尔多斯市| 竹北市| 阿鲁科尔沁旗| 盘锦市| 遵义县| 屯门区| 广宗县| 荣成市| 茂名市| 息烽县| 囊谦县| 兴海县| 林甸县| 无锡市| 临泉县| 繁昌县| 太仆寺旗| 博客|