Android控件架構(20170427)

1.UI界面架構

每個Activity都包含一個Window對象,通常由PhoneWindow來實現,將一個DecorView設置爲整個應用窗口的根View,這裏面所有View的監聽事件,都通過WindowManagerService來進行接收,然後通過Activity對象來回調對應的onClickListener。在展示上,DecorView將屏幕分爲上下兩部分,一個是TitleView,另一個是ContentView。其中ContentView是一個ID爲content的Framelayout,通常我們編寫的界面就是這部分。

注:
1.通過設置requestWindowFeature(Window.FEATURE_NO_TITLE)來設置全屏顯示,視圖樹中的佈局就只有Content了,這個調用要在setContentView()方法之前才能生效。
2.在代碼中,程序在onCreate()方法中調用setContentView()方法後,ActivityManagerService會回調onResume()方法,此時系統纔會把整個DecorView添加到PhoneWindow中,並讓其顯示出來, 從而最終完成界面的繪製。

2.View的測量

view的測量在onMeasure()方法中進行,通過MeasureSpec類,它是一個32位的int值,其中高2位爲測量的模式,低30位爲測量的大小。
測量的模式分爲三種:
EXACTLY,即精確值模式,當我們將控件的寬高指定爲具體數值或者match_parent時,系統使用的爲該模式。

AT_MOST,即最大值模式,當控件的寬高爲wrap_content時,此時控件的尺寸只要不超過父控件允許的最大尺寸即可。

UNSPECIFIED,不指定其大小測量模式,view想多大就多大,通常情況下在繪製自定義view時纔會使用。

注:view類默認的onMeasure()只支持EXACTLY模式,如需讓自定義控件支持wrap_content屬性,就必須重寫onMeasure()

重寫onMeasure時,查看super.onMeasure()方法中,系統最終會調用setMeasuredDimension(int measuredWidth, int measuredHeight)方法將測量後的寬高值設置進去。

代碼如下:

// 重寫onMeasure
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}

// 測量寬度(高度相同)
private int measureWidth(int measureSpec) {
    int result = 0;
    // 從MeasureSpec對象中提取具體的測量模式和大小
    int specMode = MeasureSpec.getMode(measureSpec); // 模式
    int specSize = MeasureSpec.getSize(measureSpec); // 大小

    if(specMode == MeasureSpec.EXACTLY) {
        // 該模式下直接爲指定的specSize
        result = specSize;
    } else {
        // 另兩種模式需要給一個默認大小
        result = 200;
        if(specMode == MeasureSpec.AT_MOST) {
            // 該模式下取默認和指定值的最小值
            result = Math.min(result,specSize);
        }
    }
    return result;
}

3.View的繪製

重寫onDraw(),通過其中的canvas對象進行繪製。
裝載畫布:

Canvas canvas = new Canvas(bitmap)

在onDraw中可通過如下方式繪製:

canvas.drawBitmap(bitmap1, 0, 0, null);
Canvas mCanvas = new Canvas(bitmap1);
mCanvas.drawXXX

重點需要學習Canvas、Paint、Path的使用。

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