Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 繪制view的小知識點,android繪制view

Android 繪制view的小知識點,android繪制view

編輯:關於android開發

Android 繪制view的小知識點,android繪制view


【onMeasure】

直接繼承view或ViewGroup的自定義控件需要重寫onMeasure方法並設置wrap_content時的自身大小,否則在布局中使用wrap_content就相當於match_parent。

  @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int width=100;//根據需求調節默認值大小
        int height=100;//根據需求調節默認值大小
        if(widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(width, height);
        }else if(widthMode == MeasureSpec.AT_MOST){
             setMeasuredDimension(width, heightSize );
        }else if(heightMode == MeasureSpec.AT_MOST){ 
        setMeasuredDimension(widthSize , height);
     }
}

 

//LinearLayout    通過measure調用onMeasure

ViewGroup是一個抽象類,有一個抽象方法onLayout;沒有重寫onMeasure方法,但是提供了一個measureChildren來對每一個子元素進行measure

    ViewGroup的測量過程onMeasure一般都在其子類中重寫,比如在LinearLayout中的onMeasure,會先判斷線性方向,然後遍歷測量(對每個子元素執行

           measureChildBeforeLayout()方法,這個方法內部會調用子元素的measure()方法來測量其本身的大小)子元素,子元素測量完畢, LinearLayout會測量自己的大小

           setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),heightSizeAndState);

View不是抽象類

           在Activity的各個生命周期onCreat,onResume中都可能無法獲取View的准確的寬高信息,因為View的measure過程和Activity的生命周期不是同步的。

    解決辦法:1.在View的onWindowFocusChanged中執行view.getMeasuredWidth()

 

【onLayout】//LinearLayout    通過layout調用onLayout

layout方法確定View本身的位置,而onLayout遍歷子元素(通過setChildFrame)調用子元素的layout方法確定子元素的位置。

 

【onDraw】

通過draw方法調用下面的四個方法

1.繪制背景background.draw(canvas)。

2.繪制自己onDraw(canvas)。

3.繪制children(dispatchDraw(canvas))。

4.繪制裝飾(onDrawScrollBars(canvas))。

View的繪制的傳遞是通過dispatchDraw來實現的,(在ViewGroup中的)dispatchDraw會遍歷所有子元素的draw方法,如此draw事件就可以一層層的傳遞下去

 

ViewRoot對應於ViewRootImpl類,它是連接WindowManager和Deco人View(FrameLayout)的紐帶。

 

 

自定義View須知:

1.讓View支持wrap_content;

2.如果必要,讓你的View支持padding:這是因為直接繼承View的控件,如果不在draw方法中處理paddong,那麼padding屬性是無法起作用的。另外繼承自ViewGroup的控件需要在onMeasure和onLayout中考慮padding和子元素的margin對其造成的影響,不然將導致padding和子元素的margin失效。

3.盡量不要在View中使用handler,沒必要,因為View中本身就有post系列的方法,可以替代handler

4.View中如果有線程或動畫,需要及時停止,參考View#onDetachedFromWindow。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved