Android 群英傳筆記
第一章Android體系與系統(tǒng)架構(gòu)
第二章 Android開發(fā)工具及技巧
第三章 Android控件架構(gòu)與事件攔截機制
第四章 ListView 使用技巧
第五章 Android Scroll 分析
第六章 Android 繪圖機制與屏幕適配
第七章 Android 動畫機制與使用技巧
第八章 Activity與Activity調(diào)用棧分析
第九章 Android 系統(tǒng)信息與安全機制
第十章 Android性能優(yōu)化
本文出自:
http://www.itdecent.cn/u/a1251e598483
Android 控件架構(gòu)
Android的每個控件都是占一塊矩形的區(qū)域,大致的分兩類,繼承View和ViewGroup,ViewGroup相當(dāng)于一個容器,他可以管理多個字View,,整個界面上的控件形成了一個樹形結(jié)構(gòu),也就是我們常說的控件樹,上層控件負(fù)責(zé)下層控件的測量和繪制,并且傳遞交互事件,通過findviewbyid()這個方法來獲取,其實就是遍歷查找,在樹形圖的頂部都有一個ViewParent對象,這就是控制核心,所有的交互管理事件都是由它統(tǒng)一調(diào)度和分配,從而進行整個視圖的控制
通常情況下,我們要顯示一個activity的視圖,需要使用setContentView()方法,那么這個方法到底做了些什么呢?我們先來看看Android界面的架構(gòu)圖


我們可以看到,每個activity都有一個window對象,在Android中,window對象通常由一個phoneWindow去實現(xiàn)的,phoneWindow將一個DecorView設(shè)置為整個窗口的根View,DecorView作為窗口界面的頂層視圖,封裝了一些通用的方法,可以說,DecorView將要顯示的內(nèi)容都給了phoneWindow,這里面所有的View監(jiān)聽,都是通過WindowManagerService來接收的,通過相應(yīng)的回調(diào)來OnClicListener,在顯示上,他將屏幕分成了兩部分,一個title一個content,看到這里,大家應(yīng)該能看到一個熟悉的界面ContentView,它是一個ID為content的FrameLayout,activity_main.xml就是設(shè)置在這個FrameLayout里面
默認(rèn)是有title 的,如果我們想讓頁面全屏顯示,比如: 啟動頁,不要顯示title,就可以通過requestWindowFeature(Window.FEATURE_NO_TITLE)來設(shè)置全屏顯示
這個需要再setContentView()方法調(diào)用之前.
或者通過設(shè)置theme的方式處理全屏的問題,繼承正常的theme 增加一個 <item name="android:windowNoTitle">true</item> 也是可以全屏顯示頁面 同樣的 setTheme(R.style.AppTheme);要在setContentView()方法調(diào)用之前調(diào)用
而在onCreate()調(diào)用setContentView()方法后,ActivityManagerService會直接調(diào)用onResume,這個時候系統(tǒng)會把整個DecorView添加到PhoneWindow,然后顯示出來完成最后的繪制.
自定義View 前面已經(jīng)寫過很詳細(xì)的系列文章了.http://www.itdecent.cn/p/bd153dfc0095
再補充點內(nèi)容:
在View中通常有以下一些比較重要的回調(diào)方法.
- onFinishInflate(): 從XML 加載組件后回調(diào);
- onSizeChanged(): 組件大小改變時回調(diào);
- onMeasure(): 回調(diào)改方法來進行測量;
- onLayout(); 回調(diào)該方法來確定顯示的位置;
- onTouchEvent(): 監(jiān)聽到觸摸事件時回調(diào);
自定義View 可以分為三種:
- 對現(xiàn)有控件進行拓展;
- 通過組合來實現(xiàn)新的控件;
- 重寫View 來實現(xiàn)全新的控件
事件攔截機制
想自己敲來著,發(fā)現(xiàn)我按照例子來寫布局, ViewGroupB 和View C怎么都顯示不出來,我再調(diào)調(diào),先借用 吳小龍同學(xué)的 原文 http://wuxiaolong.me/2015/12/19/MotionEvent/ 來說一下理論

角色:
一個經(jīng)理:MotionEventViewGroupA,最外層的ViewGroupA;
一個組長:MotionEventViewGroupB,中間的ViewGroupB;
一個你:MotionEventViewC,最底層的碼農(nóng)。
模擬:
經(jīng)理分派任務(wù),下屬處理這個任務(wù)的過程。
不做任何修改,點擊MotionEventViewC
MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC
MotionEventViewGroupB onTouchEventB
MotionEventViewGroupA onTouchEventA
log信息看出,正常情況,事件傳遞順序:
經(jīng)理 –> 組長 –> 你,先執(zhí)行dispatchTouchEvent(分發(fā)),再執(zhí)行onInterceptTouchEvent(攔截)
事件處理順序:
你 –> 組長 –> 經(jīng)理,事件處理都是執(zhí)行onTouchEvent(處理)。
事件傳遞返回值:true,攔截,交給自己的onTouchEvent處理;false,不攔截,傳給下屬。
事件處理返回值:true,自己搞定,不用上報上司;false,上報上司處理。
初始返回都是false。
事件傳遞,dispatchTouchEvent一般不太會改寫,只關(guān)心onInterceptTouchEvent。
經(jīng)理覺得這個任務(wù)太簡單,自己處理
即MotionEventViewGroupA里onInterceptTouchEvent返回true,我們看下log信息:
MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupA onTouchEventA
組長覺得這個任務(wù)太簡單,自己處理
即MotionEventViewGroupB里onInterceptTouchEvent返回true,我們看下log信息:
MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewGroupB onTouchEventB
MotionEventViewGroupA onTouchEventA
你迫于壓力,辭職不干了,任務(wù)閑置
即MotionEventViewC里onTouchEvent返回true,我們看下log信息:
MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC
事件處理到你這里就結(jié)束了。
組長覺得你任務(wù)完成太爛,不敢上報
即MotionEventViewB里onTouchEvent返回true,我們看下log信息:
MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC
MotionEventViewGroupB onTouchEventB
事件處理經(jīng)過你和組長,到組長那里就結(jié)束了。