學習的過程當中善於總結才能快速提高我的的水平,特別做爲程序員。項目優化也是很重要的一部分,最近尋思着寫一篇文章總結,不管是對之後的開發或者提高自身的水平都有用。在寫這篇文章以前,結合自身項目經驗網上多篇博客,這裏作個總結,特別一些細節的原理,我也會在文末附上相關的連接,雖然有時候不須要了解原理。關於UI方面的優化不能光看一遍就完事了,主要仍是開始時主動去培養這樣的習慣,本篇的順序主要是依照UI優化重要等級寫的。android
你們應該都瞭解過,簡單說一下,接下來主要講解咱們實際開發中怎麼去避免這種現象。Overdraw(過分繪製)是指屏幕上的某個像素在同一幀的時間內被繪製了屢次。 git
若是當前區域被繪製兩次,就是過分繪製一次,以此類推,每繪製一次都會消耗性能CPU、GPU、還有電量等,因此做爲開發就是儘可能減小同一區域繪製次數。 過分繪製主要成因以下:一、 因爲佈局複雜形成嵌套佈局 二、佈局中的view設置多層背景顏色程序員
我這裏會分爲大概三種狀況:github
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/launch_screens</item>
</style>
複製代碼
或者以下(不建議):bash
<style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>
複製代碼
設置加載以後在oncreat()方法中再設置以下除去內存佔用網絡
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//將window的背景圖設置爲空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
複製代碼
若是是普通Activity,則能夠:ide
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setBackgroundDrawable(null);
}
複製代碼
參考連接: juejin.im/post/5bf8f9…工具
##經常使用佈局性能比較佈局
經過上圖總結幾點:post
(還有須要總結的地方)
自定義View裏面最重要,也是優化的最重要部分。
ondraw方法裏面儘可能不要去初始化對象,初始化過程放在構造方法裏,在ondraw方法裏面初始變量,若是須要invalidate(),則會一直調用ondraw(),會致使內存一直建立和回收,形成內存抖動。
不要頻繁的設置可見於不可見方法,這樣也會調用,儘可能在xml設置的就是默認的狀態,減小ondraw方法調用。
儘可能在View的內容發生改變的時候纔去觸發invalidate方法
儘可能使用ClipRect等方法來提升繪製的性能(重疊的部分不去繪製)。
減小沒必要要元素的繪製
不在屏幕的元素儘可能使用Canvas.quickReject把他們給剔除
任什麼時候刻對View調用requestLayout()方法,都須要遍歷整個View樹,肯定每一個視圖它們所佔用的大小。若是在measure過程當中有任何衝突,可能會屢次遍歷。 若是UI設計師給的效果過於複雜,就須要自定義onlayout 方法,而且能夠減小嵌套問題,優化measure過程。
該方法用於裁剪畫布,調用clipRect()方法後,只會顯示被裁剪的區域,以外的區域將不會顯示。 該方法最後有一個參數Region.Op,表示與以前區域的區域間運算種類,若是沒有這個參數,則默認爲Region.Op.INTERSECT 這幾個參數的意義爲:
include標籤經常使用於將佈局中的公共部分提取出來,好比頁面全部的actionbar那麼就能夠直接include進去了。 注意事項:
merge標籤是做爲include標籤的一種輔助擴展來使用,它的主要做用是爲了防止在引用佈局文件時產生多餘的佈局嵌套。Android渲染須要消耗時間,佈局越複雜,性能就越差。如上述include標籤引入了以前的LinearLayout以後致使了界面多了一個層級。 注意事項:
ViewStub 直接繼承自View,默認是不可見的,沒有measure過程,只有加載的時候纔會由加載的xml替換掉(ViewStub只能inflate一次,再次進行inflate的時候會報異常)或者設置爲Visibility時纔可見。最大特色就是使用才加載。 這裏簡述一個經常使用的使用場景,有時候頁面沒有數據,會顯示無數據頁面或者網絡異常頁面,這種狀況就很好的利用了使用時纔去加載。
注意事項:
設置爲GONE的View不會佔用佈局空間,可是會進行類的初始化;如ImageView 將src設置爲一個BitmapDrawable,那麼該圖片將會加載到內中 ViewStub只有在代碼中進行inflate以後纔會加載進來,不會佔用內存。
性能對比: blog.csdn.net/wolinxuebin…
Space 常常用於組件之間的縫隙,其draw()爲空,減小了繪製渲染的過程。組件之間的距離使用 Space 會提升了繪製效率,特別是對於動態設置間距會很方便高效。由於draw()爲空,對該 view 沒有作任務繪製渲染,因此不能對 Space 設置背景色,若是須要的間隔須要設置顏色是明顯不合適的。Space 相對於View設置間距的好處是不用draw,缺點是不能設置背景色。
若是初始化View不可見的時候,使用View.GONE代替View.VISIBLE,設置GONE的view會加載的時候標記,不會去measure過程。
減小alpha值對性能的影響 對於不透明的View,顯示它只須要渲染一次便可,但是若是這個View設置了alpha 值,會至少須要渲染兩次。緣由是包含alpha的view須要事先知道混合View的下一層元素是什麼,而後再結合上層的View進行Blend混色處理,而且對於設置。
TextView設置文字和圖片減小View的解析加載
使用TextView設置換行功能,例如:
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="第一行\第二行" />
複製代碼
UI渲染
blog.csdn.net/lmj62356579… UI卡頓優化
blog.csdn.net/joye123/art…
UI優化工具Lint
blog.csdn.net/luzhenyuxfc…
UI優化工具Hierarchy Viewer
www.jianshu.com/p/e9e05ce5b… github.com/romainguy/V…