<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">醉醉哒</span>
相信有建立過“自定義View”經驗的衆多的開發者朋友當中有相當一部分人猿友是直接copy網上的一些代碼拿來用,結果往往不盡如人意,碰到bug或者是需求發生變化時往往手忙腳亂,android自定義View你真的知道麼???
本文主要是整理介紹一下“自定義View"的 一些容易踩坑的地方和一些優化,其中包括自定義屬性、手勢互動以及優化自定View的具體點,這邊可能需要讀者們對"如何建立一個自定義View"有一定的了解或者實踐,至于還沒接觸過自定義View的讀者們可以檢視官網: http://developer.android.com/intl/zh-cn/training/custom-views/create-view.html(需翻牆)裡面介紹得很詳細。
在此之前我們說說自定義View 你一定需要知道的知識點:
1. invalidate():當view的某些内容發生變化的時候,需要調用invalidate來通知系統對這個view進行redraw http://developer.android.com/intl/zh-cn/reference/android/view/View.html#invalidate(;
2. requestLayout(:當某些元素變化會引起元件大小變化時,需要調用requestLayout方法 http://developer.android.com/intl/zh-cn/reference/android/view/View.html#requestLayout( ;
3.View的三大繪制流程:onMeasure()、onLayout()、onDraw();
4. 手勢輔助類:GestureDetector、ViewDragHelper、Scroller:http://developer.android.com/intl/zh-cn/reference/android/view/GestureDetector.html;http://www.cnblogs.com/sw926/p/3208158.html;http://blog.csdn.net/pi9nc/article/details/39583377;http://blog.csdn.net/gemmem/article/details/7321910;
5. Android中自定義屬性的格式詳解;
6. Paint Canvas
自定義VIew具體調優建議:
1. 在Gradle工程中,始終使用 http://schemas.android.com/apk/res-auto的自定義屬性,然而在官網中沒有提到這個:
2. 如果你的view是一個inner class,你必須指定這個view的outer class。同樣的,如果PieChart有一個inner class 叫做PieView。為了使用這個類中自設的屬性,你應該使用com.example.customviews.charting.PieChart$PieView.
3. 在屬性定義時指定多種類型值,比如說 我設定VIew的背景可以是“@drawable/圖檔ID”也可以是“#00FF00”如:
<attr name = "background" format = "reference|color" />
4. 使用obtainStyledAttributes() 來擷取屬性值 ,這樣就不用判斷 我的屬性設定的是實際資料“str/#color”還是“@resID”了,用法如:
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.PieChart,
0, 0);
try {
mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
} finally {
a.recycle();
}
清注意TypedArray對象是一個共享資源,必須被在使用後進行回收。
5. 發生動态行為時采用invalidate() and requestLayout();
6. android:contentDescription屬性标記輸入字段 與sendAccessibilityEvent()在适當的時候通過調用發送通路事件。參考:http://developer.android.com/intl/zh-cn/guide/topics/ui/accessibility/apps.html#custom-views和 Android無障礙服務 讓應用具有輔助性服務.
7. 初始化時建立對象;不要在onDraw方法内建立繪制對象;
8. 讓View支援 wrap_content 和 padding;
9.使用手勢監聽處理UI互動:GestureDetector;
10.使用過渡平滑:property animation framework;
12.另外盡可能的減少繪制 即調用OnDraw();大多數時候導緻onDraw都是因為調用了invalidate().是以請盡量減少調用invaildate() 的次數。如果可能的話,盡量調用 含有4個參數的invalidate() 方法而不是沒有參數的invalidate()。沒有參數的invalidate會強制重繪整個view。
13.另外一個非常耗時的操作是請求layout。任何時候執行requestLayout(),會使得Android UI系統去周遊整個View的層級來計算出每一個view的大小。如果找到有沖突的值,它會需要重新計算好幾次。另外需要盡量保持View的層級是扁平化的,這樣對提高效率很有幫助;
14.使用硬體加速 http://developer.android.com/intl/zh-cn/guide/topics/graphics/hardware-accel.html
15. 狀态的存儲與恢複:如果記憶體不足,而恰好我們的Activity置于背景,不幸被重新開機,或者使用者旋轉螢幕造成Activity重新開機,我們的View應該也能盡可能的去儲存自己的屬性。
--------------------------------------------------------------------------------------------------------------------
Ps:編輯器太難用了,太難用了。嚴重打擊了我的寫部落格的欲望.