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

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

隨我一起慢慢揭開(kāi)Andoird里事件分發(fā)機(jī)制的神秘面紗-創(chuàng)新互聯(lián)

轉(zhuǎn)載好文章:

創(chuàng)新互聯(lián)建站是專業(yè)的涿州網(wǎng)站建設(shè)公司,涿州接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行涿州網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

    http://blog.csdn.net/chunqiuwei/article/details/41084921

 學(xué)了這么久的Android,面試也常被問(wèn)到事件分發(fā)機(jī)制,但總感覺(jué)對(duì)這個(gè)機(jī)制還是不清不楚.突然之間

 翻了一下李剛的,突然有了一些感悟,所以就立馬記下來(lái):

一、監(jiān)聽(tīng)與回調(diào)

  第一,要明白和事件相關(guān)的3個(gè)概念:事件源,事件,事件監(jiān)聽(tīng)器.

  事件源:就是事件作用的對(duì)象

  事件:就是事件本身,可以是點(diǎn)擊,長(zhǎng)按,移動(dòng)等等,就是XxxEvent.

  事件監(jiān)聽(tīng)器:就是Listener,一般寫(xiě)成內(nèi)部類的形式,說(shuō)白了,就是一個(gè)類,而這個(gè)類往往是事件源

      內(nèi)部的接口實(shí)現(xiàn)類。

  第二,上總結(jié)得很到位:Android中的事件處理機(jī)制可以分為兩大類,監(jiān)聽(tīng)回調(diào).

  監(jiān)聽(tīng):就是給控件添加一個(gè)監(jiān)聽(tīng)器,即addXxxListener(new XxxListener(){...}),事件源本身不直

   接處理,而是交由事件監(jiān)聽(tīng)器進(jìn)行處理.

  回調(diào):當(dāng)事件作用在事件源的時(shí)候,事件源本身會(huì)觸發(fā)一些自己的方法,自己來(lái)處理事件.但往往事件

     源的這些方法是封裝在事件源對(duì)象的內(nèi)部的,用戶看不見(jiàn).這也就是為什么需要有監(jiān)聽(tīng)器的原

     因,讓用戶知道事件源發(fā)生了什么事件.通常在自定義控件的時(shí)候,就需要復(fù)寫(xiě)和Touch相關(guān)的

     事件,同時(shí)抽取監(jiān)聽(tīng)器接口,讓用戶去實(shí)現(xiàn).

-----------------------------------------------------------------------------------------

  舉個(gè)小例子:

   假如有這樣一個(gè)需求:點(diǎn)擊一下Button,打印一條日志.

   那么有2種實(shí)現(xiàn)方式

   第1種實(shí)現(xiàn)方式-為Button設(shè)置監(jiān)聽(tīng)器

     Button.setOnClickListener(new OnClickListener(){

        onClick(View view)

      {

       Log...

      } 

     });

   第2種實(shí)現(xiàn)方式-繼承Button,自定義一個(gè)MyButton

     定義的時(shí)候,復(fù)寫(xiě)B(tài)utton的onTouchEvent方法,在里面打印日志.

    那么,現(xiàn)在又有一個(gè)需求:點(diǎn)擊一下Button,彈出一個(gè)吐司.

   如果采用第1種方式,只要修改一下onClick里的代碼.

   如果采用第2種方式,那么1種辦法是再創(chuàng)建一個(gè)Button的子類,另外一個(gè)方法就是修改原來(lái)

    MyButton的onTouchEvent方法,但是這樣一來(lái)又不能滿足開(kāi)始的需求了.

   所以到這里,監(jiān)聽(tīng)與回調(diào)的區(qū)別也就不言而喻了吧.

    1)監(jiān)聽(tīng)只是組件的作者在寫(xiě)回調(diào)方法時(shí),暴露給用戶的一個(gè)接口,這樣用戶可以實(shí)現(xiàn)接口,

    達(dá)到自身的需求,最終用戶實(shí)現(xiàn)的接口里的方法在組件的回調(diào)方法里會(huì)被回調(diào)。

二、結(jié)合2.3.3中View的源碼,再談監(jiān)聽(tīng)與回調(diào)

  1.View的dispatchTouchEvent方法

  我之前一直沒(méi)有搞清楚View的dispatchTouchEvent的返回值的作用,現(xiàn)在明白了,

  返回true,作用在View上的觸摸事件(包括Button的點(diǎn)擊事件)就會(huì)生效;

  返回false,作用在View上的觸摸事件就失效。

  但具體dispatchTouchEvent方法又在哪里被調(diào)用了呢(?????????????)

     public boolean dispatchTouchEvent(MotionEvent event) {            。。。             if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&                     mOnTouchListener.onTouch(this, event)) {                 return true;             }             return onTouchEvent(event);      }

    2)監(jiān)聽(tīng)是先判斷的,所以監(jiān)聽(tīng)比回調(diào)的優(yōu)先級(jí)要高。先判斷l(xiāng)istener.onTouch的返回值

    ,否則就return onTouchEvent(event)將事件交由組件的onTouchEvent回調(diào)方法進(jìn)行處理。

   所謂View的事件分發(fā),解決的問(wèn)題就是事件是由用戶處理還是View自身處理。

三、結(jié)合2.3.3中ViewGroup的源碼,再談監(jiān)聽(tīng)與回調(diào)

    由于ViewGroup的dispatch事件源碼過(guò)多,我就不一一寫(xiě)了,大致地去描述一下。

   ViewGroup的dispatch事件干的事:

   先弄一個(gè)變量來(lái)緩存可能會(huì)捕捉并處理事件的View,target.

   在點(diǎn)擊ev.getAction == MotionEvent.Action_Down的事件里

       根據(jù)onIntercept事件判斷自己需不需要攔截事件,如果不攔截,則遍歷ViewGroup里的

   每個(gè)子View,通過(guò)計(jì)算子View的矩形區(qū)域來(lái)判斷點(diǎn)擊事件的坐標(biāo)有沒(méi)有落在子View上,如果點(diǎn)

   擊事件的坐標(biāo)落在子View并且子View捕捉并處理事件,那么target就等于這個(gè)子View。

      判斷target是否為null

      如果為null,則調(diào)用ViewGroup的父類的dispatch事件,也就是把ViewGroup當(dāng)作

     View來(lái)處理。

      如果不為null,則交由target.dispatch事件進(jìn)行處理。

    所謂ViewGroup的事件分發(fā),解決的問(wèn)題就是事件到底是由哪個(gè)View來(lái)處理。

四、FrameLayout的事件分發(fā)機(jī)制

  我們都知道,ViewGroup的事件傳遞順序是由父控件往子控件傳遞,但是假如是FrameLayout的兩

  個(gè)子控件重疊在一起,并且兩個(gè)子控件沒(méi)有包含(父子)關(guān)系,那么事件的傳遞順序是怎樣的呢

  其實(shí)這個(gè)Android源碼里已經(jīng)說(shuō)得十分地清楚了,

// Scan children from front to back.

  也就是從上往下查找,自然事件也是從上往下傳遞。

  1)在做《風(fēng)口》項(xiàng)目時(shí),我也遇到過(guò)這種問(wèn)題:

    明明點(diǎn)擊的地方什么也沒(méi)有,但是事件卻被響應(yīng)了。我將布局看來(lái)看去,想了很久,突然

  明白這就是事件分發(fā)導(dǎo)致的。FrameLayout的上層Layout點(diǎn)擊的位置沒(méi)有控件響應(yīng)事件,但是在下

  一層的Layout中,鼠標(biāo)點(diǎn)位的位置有控件響應(yīng)。這種解釋了這種見(jiàn)鬼的原因!

  2)小資錢包首頁(yè),“馬上搶購(gòu)”按鈕和它所在的父布局響應(yīng)同樣的事件。

   第1種方法:給2者注冊(cè)同一個(gè)監(jiān)聽(tīng)器

   第2種方法:屏蔽Button對(duì)事件的響應(yīng),只注冊(cè)父布局的監(jiān)聽(tīng)。(即怎么讓按鈕可點(diǎn)擊但是不響

         應(yīng)點(diǎn)擊事件)

         復(fù)寫(xiě)B(tài)utton onIntercept方法返回false.

    

    

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)題目:隨我一起慢慢揭開(kāi)Andoird里事件分發(fā)機(jī)制的神秘面紗-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://weahome.cn/article/ccoicp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部