1. 程式人生 > >《Android群英傳》---讀書筆記1

《Android群英傳》---讀書筆記1

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