1. 程式人生 > >android的View

android的View

exactly clas height ecif 設定 bsp 尺寸 目的 進行

  1、android的界面使用組合模式實現。

    -ViewGroup
        --ViewGroup
        --VieW

  2、View繪制主要包括三個步驟:

    測量(Measure)   :計算View的mMeasuredXXX(即View出現在界面上的寬高)
    布局(Layout)   :計算View的繪制的位置
    繪制(Draw) :使用前面兩步的結果,將View以特定大小,繪制在特定的位置。

  3、測量:

    1)測量的最終目的是依據View的相關屬性、View與父容器的關系、父容器的相關屬性,計算View的高度和寬度。

    2)我們可以重寫onMeasure方法來編碼自己的View測量代碼——計算出View的高度和寬度,使用setMeasuredDimension方法,賦值給mMeasuredXXX相關變量。

    3)我們進行測量計算,View的相關屬性可以自己直接獲取,而需要的父容器的一些信息和與父容器關系的信息,就需要引入MeasureSpec包含父容器的信息,然後傳入onMeasure函數。

    4)MeasureSpec包含兩個信息:

      a)MeasureSpec的模式,exactly(精確模式,即父容器給View的寬高設定了確定的數值),AT_MOST(範圍,即父容器給View的寬高設定了一個範圍),UNSPECIFIED(無限制,父容器沒有給子容器限制。

      b)MeasureSpec傳遞的寬高值。

    5)View計算寬高除了MeasureSpec的信息外,會用到View自身的minHeight、minWidth和背景圖片的大小等,大多數的View子類會使用不同的其他屬性。

    6)ViewGroup子類測量的是時候,一般會獲取計算獲取所有子元素的尺寸,然後依據自身的布局規則,計算自己的尺寸。如FrameLayou可能t獲取的是子元素中最大的,LinearLayout可能是子元素的累加值。

  4、布局(Layout):

    1) 我們調用View的layout函數,內部會調用setFrame(l,t,r,b)直接確定了View在父容器中的四個方向上的距離值——mRight - mLeft, mBottom - mTop

。所以雖然我們實現的時候,會使用前面計算的View的寬高值,來確定l,t,r,b這四個值,但是View最終繪制時,只是使用這裏傳入值,如果我們這裏修改了,View的寬高會和計算的寬高不同,也就是(getWidth和getMeasuredWidth)獲取的值不同了。

  5、繪制(Draw):

    繪制的位置和範圍確定了,然後就是繪制內容。

    通過重寫onDraw函數實現對View的繪制,繪制的具體內容和View本身有關。

android的View