035android初級篇之[轉(zhuǎn)]android的ViewGroup與View

概念

Android中的View包含了用戶交互和顯示,類似于Windows操作系統(tǒng)中的window掏颊。

ViewGroup是View的子類糟红,所以它也具有View的特性艾帐,但它主要用來充當View的容器,將其中的View視作自己的孩子盆偿,對它的子View進行管理柒爸,當然它的孩子也可以是ViewGroup類型。

ViewGroup(樹根)和它的孩子們(View和ViewGroup)以樹形結(jié)構(gòu)形成了一個層次結(jié)構(gòu)陈肛,View類有接受和處理消息的功能揍鸟,android系統(tǒng)所產(chǎn)生的消息會在這些ViewGroup和 View之間傳遞。

Android的窗口系統(tǒng)

Android的窗口系統(tǒng)是Client/Server模式的句旱。所提到的概念:View阳藻,ViewGroup,DecorView谈撒,ViewRoot都是存在于窗口系統(tǒng)的Client端腥泥。

Android中的Window是表示Top Level等頂級窗口的概念。DecorView是Window的Top-Level View啃匿,這個View可以稱之為主View蛔外,DecorView會缺省的attach到Activity的主窗口中。

ViewRoot建立了主View(DecorView)與窗口系統(tǒng)Server端的通訊橋梁, ViewRoot是 Handler的子類溯乒,即它其實是個Handler夹厌,它接受窗口系統(tǒng)服務(wù)器端的消息并將消息投遞到窗口系統(tǒng)的客戶端,然后消息就從客戶端的主View往其下面的子View傳遞裆悄,直到消息被完全處理掉為止矛纹。

ViewRoot建立了主View(DecorView)與窗口系統(tǒng)Server端的通訊橋梁, ViewRoot是 Handler的子類,即它其實是個Handler光稼,它接受窗口系統(tǒng)服務(wù)器端的消息并將消息投遞到窗口系統(tǒng)的客戶端(圖1)或南,然后消息就從客戶端的主View往其下面的子View傳遞,直到消息被完全處理掉為止艾君。

035_1.png

DecorView實際上是一個ViewGroup采够。在依存關(guān)系上來講,對單個主窗口來講冰垄,DecorView是Top-Level View蹬癌。View并不是關(guān)注的重點,重要的是我們需要知道消息分發(fā)路徑是建立在什么關(guān)系上的虹茶。View的成員變量mParent用來管理View上級關(guān)系的冀瓦。而ViewGroup顧名思義就是一組View的管理,于是在ViewGroup構(gòu)建了焦點管理和子View節(jié)點數(shù)組写烤。這樣通過View的mParent和ViewGroup的mChildren構(gòu)建了Android中View直接的關(guān)系網(wǎng)翼闽。

035_2.png

View

繪制流程

繪制按照視圖樹的順序執(zhí)行。視圖繪制時會先繪制子控件洲炊。如果視圖的背景可見感局,視圖會在調(diào)用onDraw函數(shù)之前繪制背景尼啡。強制重繪,可以使用invalidate()询微。

事件的基本流程如下:

  1. 事件分配給相應(yīng)視圖崖瞭,視圖處理它,并通知相關(guān)監(jiān)聽器撑毛。
  2. 操作過程中如果發(fā)生視圖的尺寸變化书聚,則該視圖用調(diào)用requestLayout()方法,向父控件請求再次布局藻雌。
  3. 操作過程中如果發(fā)生視圖的外觀變化雌续,則該視圖用調(diào)用invalidate()方法,請求重繪胯杭。
  4. 如果requestLayout()或invalidate()有一個被調(diào)用驯杜,框架會對視圖樹進行相關(guān)的測量、布局和繪制做个。

注意鸽心,視圖樹是單線程操作,直接調(diào)用其它視圖的方法必須要在UI線程里居暖⊥缙担跨線程的操作必須使用句柄Handler。

焦點處理:

框架處理焦點的轉(zhuǎn)移太闺,來響應(yīng)用戶輸入冲九。isFocusable()函數(shù)表示視圖是否能接受焦點。setFocusable(boolean)函數(shù)可以改變視圖能否接受焦點跟束。觸摸屏模式(Touch Mode)的相關(guān)函數(shù)是isFocusableInTouchMode()和setFocusableInTouchMode(boolean)。
焦點轉(zhuǎn)移按照就近算法丑孩。按哪個方向就近可以在XML布局文件中配置冀宴。

nextFocusDown
nextFocusLeft
nextFocusRight
nextFocusUp

視圖請求焦點可以使用requestFocus()。

類成員介紹

protected ViewParent mParent;

用于記錄其父目錄温学,就是前面提到的ViewGroup略贮;

protected OnClickListener mOnClickListener;
click事件的回調(diào)接口.

public void draw(Canvas canvas)

這個函數(shù)用于渲染View和它的孩子,我們不應(yīng)該在子類對它進行override仗岖。

protected void onDraw(Canvas canvas)

我們一般override此函數(shù)來實現(xiàn)自己的繪制操作逃延。

IWindowSession getWindowSession() {
     return mAttachInfo != null ? mAttachInfo.mSession : null;
}

函數(shù)getWindowSession()用于得到窗口系統(tǒng)Client端和服務(wù)器端通訊的接口IWindowSession。這是一個AIDL接口轧拄,android系統(tǒng)中的跨進程通訊就是用AIDL接口實現(xiàn)的揽祥。

public final void layout(int l, int t, int r, int b)

此函數(shù)用于確定View和其子View的尺寸和位置,它的調(diào)用發(fā)生在onMeasure之后檩电。

** protected void onLayout(boolean changed, int left, int top, int right, int bottom)**

此函數(shù)在layout調(diào)用完成后執(zhí)行拄丰,View的子類一般override此函數(shù)府树,并在函數(shù)中對其每個孩子調(diào)用layout方法。

public View getRootView()

此函數(shù)用于得到View層次結(jié)構(gòu)的top-level View料按,即上文中提到的DecorView奄侠。

public final void measure(int widthMeasureSpec, int heightMeasureSpec)

此函數(shù)用戶找出View的大小,它的參數(shù)widthMeasureSpec载矿、heightMeasureSpec是其父親傳遞給它的垄潮,這2個參數(shù)是View找出其大小時的限制條件,其實真正的精確大小確定是由onMeasure()完成的闷盔,onMeasure由measure函數(shù)調(diào)用弯洗。

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

此函數(shù)測量View并根據(jù)其內(nèi)容來決定View的高和寬,它應(yīng)該被子類override以實現(xiàn)大小的精確測量馁筐。在onMeasure中我們必須調(diào)用View.setMeasuredDimension(int, int)來保存測量得到的大小,高和寬分別被保存在View.mMeasuredHeight和View.mMeasureWidth中涂召。

public boolean onKeyUp(int keyCode, KeyEvent event)

此函數(shù)會在鍵盤按鍵釋放后被調(diào)用,但前提是View必須獲得焦點敏沉。

public boolean onTouchEvent(MotionEvent event)

此函數(shù)用于響應(yīng)觸摸屏事件果正。

public void invalidate()

此函數(shù)將調(diào)用onDraw,強制重繪盟迟。

public void requestLayout()

當某些東西發(fā)生改變后秋泳,當前View層次結(jié)構(gòu)無效了,調(diào)用此函數(shù)對View的層次結(jié)構(gòu)進行重新布局攒菠。

ViewGroup

ViewGroup繼承于View迫皱,它可以包含其他的View,就像一個View的容器辖众,我們可以調(diào)用其成員函數(shù)addView()將View當作孩子放到ViewGroup中卓起。

我們經(jīng)常使用的LinearLayout、relativeLayout等都是ViewGroup的子類凹炸,ViewGroup類中有一個內(nèi)部類ViewGroup.LayoutParams戏阅,我們經(jīng)常使用LayoutParams的子類來構(gòu)造布局參數(shù)。
我們也可以自定義自己的布局啤它,以方便日后使用和維護奕筐,這時我們就需要繼承ViewGroup類并在派生類中重寫ViewGroup的一些方法.

參考鏈接

  1. Android的View和ViewGroup分析
  2. Android繪制View的過程研究——計算View的大小
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市变骡,隨后出現(xiàn)的幾起案子离赫,更是在濱河造成了極大的恐慌,老刑警劉巖塌碌,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渊胸,死亡現(xiàn)場離奇詭異,居然都是意外死亡台妆,警方通過查閱死者的電腦和手機蹬刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門瓢捉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人办成,你說我怎么就攤上這事泡态。” “怎么了迂卢?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵某弦,是天一觀的道長。 經(jīng)常有香客問我而克,道長靶壮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任员萍,我火速辦了婚禮腾降,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碎绎。我一直安慰自己螃壤,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布筋帖。 她就那樣靜靜地躺著奸晴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪日麸。 梳的紋絲不亂的頭發(fā)上寄啼,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音代箭,去河邊找鬼墩划。 笑死,一個胖子當著我的面吹牛嗡综,可吹牛的內(nèi)容都是我干的乙帮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蛤高,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碑幅?” 一聲冷哼從身側(cè)響起戴陡,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沟涨,沒想到半個月后恤批,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡裹赴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年喜庞,在試婚紗的時候發(fā)現(xiàn)自己被綠了诀浪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡延都,死狀恐怖雷猪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晰房,我是刑警寧澤求摇,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站殊者,受9級特大地震影響与境,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猖吴,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一摔刁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧海蔽,春花似錦共屈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刑然,卻和暖如春寺擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泼掠。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工怔软, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人择镇。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓挡逼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腻豌。 傳聞我的和親對象是個殘疾皇子家坎,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容