Android羣英傳—-讀書筆記
標籤: android進階 讀書筆記
1.3 Android app組件架構
應用運行上下文
可以理解爲Context即爲android系統中應用的上下文對象
Activity, Service, Application都是繼承自Context
當應用程序第一次啓動的時候,Android系統會創建一個Application對象,同時創建Application Context,所有組件共同擁有這樣一個Context對象,這個Context在整個應用程序的生命週期都存在,爲應用全局提供功能和環境支持
getApplicationContext()可以獲取該全局Context
3.1 Android控件架構
每個Activity都包含一個Window對象(通常由PhoneWindow實現),然後該Window(PhoneWindow)將DecorWindow作爲整個應用窗口的根View,然後DecorWindow將屏幕分爲兩部分即TitleView和ContentView(ContentView是一個ID爲content的FrameLayout)
3.2 View的測量
1 onMeasure(int widthMeasureSpec,int heightMeasureSpec)方法
注意widthMeaureSpec和heightMeasureSpec都是MeasureSpec類,MeasureSpec是一個32的int值,高二位表示測量模式,低30位表示測量的大小,
MeasureSpec.getMode()和MeasureSpec.getSize()可以分別獲取模式和大小,測量模式分爲EXACTLY,AT_MOST,UNSPECIFIED 系統默認的onMeasure方法只支持EXACTLY模式,所以我們必須自己重寫onMeasure來支持其他的模式
2 onMeasure方法最終會將測量好的寬和高作爲參數調用系統的setMeasuredDimension(int,int)方法
(所以我們可以重寫onMeasure方法然後在其內部調用setMeasuredDimension方法,實現自己的測量邏輯)
3.4 ViewGroup的測量
在自定義ViewGroup中通常需要重寫onLayout()方法來控制子View的顯示位置,如果支持wrap_content屬性(即AT_MOST模式)還必須重寫onMeasure方法
3.6 自定義View
1 對現有控件進行擴展
2 通過組合來實現新的控件
3 重寫View來實現全新的控件
在View中通常由以下重要的回調方法
onFinishInflate():從XML加載組件後回調
onSizeChanged():組件改變大小時回調
onMeasure():回調該方法進行測量
onLayout():回調該方法來確定顯示的位置
onTouchEvent():監聽到觸摸事件回調
3.6.1 對現有控件進行擴展
一般可以在onDraw()方法中對原生控件進行擴展
3.6.2 創建複合控件
一般可以創建出具有重用功能的控件集合。通常要繼承一個合適的ViewGroup,再給它添加指定功能的控件,通常我們還會給它指定一些可配置自定義的屬性,讓它具有更好的擴展性。
自定義屬性:
1在values目錄裏面創建一個attr.xml文件
2在文件裏面通過
<declare-styleable> 標籤來聲明使用了自定義的屬性 並通過name屬性確定引用的名稱,最後通過
<attr>聲明具體的自定義屬性 ,其中name確定屬性的具體名稱,format屬性確定屬性的類型(可以用|來將多個類型分隔開來表示多個類型)
例如
<resoures>
<declare-styleable name="TopBar">
<attr name="title" format="string">
<attr name="titleSize" format="dimension">
<attr name=titleColor" format="color">
<attr name="leftBackBackground" format="reference|color">
</declare-styleable>
</resoures>
3在構造方法中通過TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.TopBar)獲得自定義屬性集
然後可以通過TypedArray 的getString(),getColor()等方法,就可以獲取這些自定義的屬性值(color類型對應的類型值爲int,圖片的引用類型爲Drawable)
4獲取屬性值之後再構造方法中回收TypedArray 調用ta.recycle()方法
5將獲得的屬性設置給我們的具體控件
6定義接口
7暴露接口給調用者
注意 如果想引用自定義屬性我們還必須指定第三方控件的引用的名字空間
在android studio中統一用 xmlns:custom="http://schemas.android.com/apk/res-auto" 來引用
這樣就可以在佈局文件中引用自定義的屬性了
3.6.3
重寫View來實現全新的控件
一般可以通過這種方式實現複雜的圖表等效果,主要通過重寫onDraw(),onMeasure()等方法來實現
3.8 事件攔截機制分析
可以借用下面的僞代碼來記憶
public boolean dispatchTouchEvent(MotionEvent ev){
boolean intercepted=false;
if(onInterceptTouchEvent(ev))
{
intercepted=onTouchEvent(ev)
}else
{
inptercepted=child.dispatchTouchEvent(ev);
}
return intercpeted;
}
事件傳遞的時候先調用dispatchTouchEvent,在調用onInterCeptTouchEvent :如果爲true,表示攔截,不繼續l;反之不攔截,繼續
事件處理的返回值即onTouchEvent:true,處理了不用返回給父類了;反之返回給父類處理
初始情況下,返回值都是false
理解事件攔截機制的目的就是來處理滑動衝突
一般來說有兩種解決辦法即:
1父類攔截法
2子類攔截法
詳細的代碼示例可以參看《Android開發藝術探索》P158