天天看點

自定義View——坑、技巧、調優

<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——坑、技巧、調優

在此之前我們說說自定義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的自定義屬性,然而在官網中沒有提到這個:

自定義View——坑、技巧、調優

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:編輯器太難用了,太難用了。嚴重打擊了我的寫部落格的欲望. 

繼續閱讀