Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 隨我一起慢慢揭開Andoird裡事件分發機制的神秘面紗

隨我一起慢慢揭開Andoird裡事件分發機制的神秘面紗

編輯:關於Android編程

學了這麼久的Android,面試也常被問到事件分發機制,但總感覺對這個機制還是不清不楚.突然之間  翻了一下李剛的<Crazy Android>,突然有了一些感悟,所以就立馬記下來:   一、監聽與回調    第一,要明白和事件相關的3個概念:事件源,事件,事件監聽器.    事件源:就是事件作用的對象    事件:就是事件本身,可以是點擊,長按,移動等等,就是XxxEvent.    事件監聽器:就是Listener,一般寫成內部類的形式,說白了,就是一個類,而這個類往往是事件源            內部的接口實現類。       第二,<Crazy Android>上總結得很到位:Android中的事件處理機制可以分為兩大類,監聽和回調.    監聽:就是給控件添加一個監聽器,即addXxxListener(new XxxListener(){...}),事件源本身不直       接處理,而是交由事件監聽器進行處理.    回調:當事件作用在事件源的時候,事件源本身會觸發一些自己的方法,自己來處理事件.但往往事件      源的這些方法是封裝在事件源對象的內部的,用戶看不見.這也就是為什麼需要有監聽器的原      因,讓用戶知道事件源發生了什麼事件.通常在自定義控件的時候,就需要復寫和Touch相關的      事件,同時抽取監聽器接口,讓用戶去實現.   -----------------------------------------------------------------------------------------    舉個小例子:       假如有這樣一個需求:點擊一下Button,打印一條日志.       那麼有2種實現方式       第1種實現方式-為Button設置監聽器          Button.setOnClickListener(new OnClickListener(){          onClick(View view)            {               Log...             }           });        第2種實現方式-繼承Button,自定義一個MyButton          定義的時候,復寫Button的onTouchEvent方法,在裡面打印日志.             那麼,現在又有一個需求:點擊一下Button,彈出一個吐司.       如果采用第1種方式,只要修改一下onClick裡的代碼.       如果采用第2種方式,那麼1種辦法是再創建一個Button的子類,另外一個方法就是修改原來         MyButton的onTouchEvent方法,但是這樣一來又不能滿足開始的需求了.              所以到這裡,監聽與回調的區別也就不言而喻了吧.   二、結合2.3.3中View的源碼,再談監聽與回調     1.View的dispatchTouchEvent方法     我之前一直沒有搞清楚View的dispatchTouchEvent的返回值的作用,現在明白了,     返回true,作用在View上的觸摸事件(包括Button的點擊事件)就會生效;     返回false,作用在View上的觸摸事件就失效。     但具體dispatchTouchEvent方法又在哪裡被調用了呢(?????????????)   
     public boolean dispatchTouchEvent(MotionEvent event) {
           。。。
            if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
                    mOnTouchListener.onTouch(this, event)) {
                return true;
            }
            return onTouchEvent(event);
     }
          

 


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved