Android開發藝術探索筆記 第三章 View的事件體系

Vicw,雖然說Vicw不屬於四大組件,但是它的作用堪比四大組件,甚至比Receiver和Provider的重要性都要大。在Android開發中,Activity承擔這可視化的功能,同時Android系統提供了很多基礎控件,比如TextView、CheckBox等。很多時候僅僅使用系統提供的控件是不能滿足需求的,因此我們就需要能夠根據需求進行新控件的定義,而控件的自定義就需要對Android的View體系有深入的瞭解,只有這樣才能寫出完美的自定義控件,同時Android手機屬於移動設備,移動設備有一個特定就是用戶可以通過屏幕來進行一系列的操作,一個典型的場景就是屏幕的滑動,用戶可以通過滑動來切換到不同的界面。很多情況下我們的應用都需要滑動操作,當處於不同層級的View都可以響應用戶的滑動操作時,就會帶來一個問題,滑動衝突,如何解決滑動衝突呢?這對於初學者來說確實是一個頭疼的問題,解決滑動衝突本身不難,它需要讀者對View的事件分發機制有一定的瞭解,在這個基礎上,我們就可以利於這個特性從而得出滑動衝突的解決方法。

一.View的基礎知識

1.1什麼是View

在介紹View的基礎知識之前,我們首先要知道到底什麼是View。View是Android中所有控件的基類,不光是簡單的Button和TextView還是複雜的RelativeLayout和Listview,它們的共同基類都是View。所以說,View是一種界面層的控件的一種抽象,它代表了一個控件,除了View,還有ViewGroup,ViewGroup內部包含了許多個控件,即一組View。在Android的設計中,ViewGroup也繼承了View,這就意味着View本身就可以是單個控件也可以是由多個控件組成的一組控件,通過這種關係就形成了View樹的結構,這和Web前端中的DOM樹的概念是相似的。根據這個概念,我們知道,Button顯然是個View,而LinearLayout不但是一個View而且還是一個ViewGroup,而ViewGroup內部是可以有子View的,這個子View同樣還可以是ViewGroup;

明白View的這種層級關係有助於理解View的工作機制。,可以看到自定義的TestButton是一個View,它繼承了TextView,而TextView則直接繼承了View,因此不管怎麼說,TestButton都是一個View,同理我們也可以構造出一個繼承自ViewGroup的控件。

2.View的位置參數
View的位置主要由它的四個頂點來決定,分別對應於View的四個屬性:top、left、right,bottom,其中top是左上角縱座標,left是左上角橫座標,right是右下角橫座標,bottom是有下角縱座標。需要注意的是,這些座標都是相對於View的父容器來說的,因此它是一種 
相對座標,View的座標和父容器的關係如圖3所示。在Android中,x軸和y軸的正別爲右和下,這點不難理解,不僅僅是Android,大部分顯示系統都是按照這個標準來定義座標系的。

è¿éåå¾çæè¿°

從圖中的關係我們很容易得到寬高的關係

width= right- left
height = bottom - top
1
2
那麼如何得到View的四個參數呢?也很簡單,在對應的源碼衆有這四個方法

Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom():
從Android3.0開始,View增加了額外的幾個參數,x,y,translationX,translationY,其中x,y是View左上角的圖標,而translationX,translationY是左上角相對父容器的便宜角量,這幾個參數也是相對於父容器的座標,並且translationX,translationY的默認值野0;和View的四個基本位置參數一樣,View也爲我們提供了get/set方法這幾個換算關係

x = left + translationX
y = top + translationY
1
2
需要注意的是,View在平移的過程中,top和left表示在原始左上角的位置信息,其值並不會發生什麼,此時發生改變的是x,y,translationX,translationY,這四個參數

3.MotionEvent和TouchSlop
1.MotionEvent
在手指接觸屏幕後所產生的一系列事件中,典型的事件類型有如下幾種:

ACTION_DOWN一手指剛接觸屏幕
ACTION_MOVE一—手指在屏幕上移動
ACTION_UP——手機從屏幕上鬆開的一瞬間
正常情況下,一次手指觸摸屏幕的行爲會觸發一系列點擊事件,考慮如下幾種情況:

點擊屏幕後離開鬆開,事件序列爲DOWN->UP
點擊屏幕滑動一會再鬆開,事件序列爲DOwN > MOVE >…..>MOVE-Up
上述三種情況是典型的事件序列,同時通過MotionEvent對象我們可以得到點擊事件發生的x和y座標。爲此,系統提供了兩組方法:getX/gety和 getRawX/getRawY。它們的區別其實很簡單,getX/getY返回的是相對於當前View左上角的x和y座標,而geiRawX/getRawY返回的是相對於手機屏幕左上角的x和y座標

 

 

 

3.4 View的事件分發

核心知識點事件分發機制

1.點擊事件的傳遞規則
我們分析的點擊事件可不是View.OnClickListener,而是我們MotionEvent,即點擊事件,關於MotionEvent在上篇說過一點點,所謂點擊事件的事件分發,其實就是對MotionEvent事件的分發過程,即當一個MoonEvent產生了以後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞的過程就是分發過程。點擊事件的分發過程由三個很重要的分發來成.dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent,下面我們先介紹一下這幾個方法。

.dispatchTouchEvent


              

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章