編輯:關於android開發
【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。
【Android性能工具】騰訊開源工具GT(隨身調),androidgt做App測試時監測使用期間的cpu,內存,流量,電量等指標時,發現的企鵝很好用的工具。 備份至此,
Android Studio添加aar,androidstudioaar1、把aar復制到項目中的 libs 裡面 2、在mod
android 動畫詳解(二) 下面就開始學習屬性動畫的基本用法,我們來看屬性動畫的繼承關系,如下如所示: 顯然關注的焦點應該是Va
Android Studio基本使用,androidstudio本文為原創文章,轉載請注明出處。 本文主要推薦給由Eclipse開發轉向使用Android Studio(