可能有些人不明白什麼是過分繪製,簡單言,咱們app一個頁面所顯示的效果是由像素一幀一幀繪製而成。過分繪製就是意味着這一幀被繪製屢次。若是是靜態的佈局,可能影響不是很大,若是是動態的,好比ListView,GridView,ViewPager等在性能上就會差一點,常見的好比listView上下滑動,過分繪製的狀況下,就會出現卡頓,或者跳躍感很明顯。 固然過分繪製確定沒法避免,咱們只能減小沒必要要的繪製,那麼如何看的出來,一個頁面是否過分繪製呢?node
下面咱們來看一下,下面說的這個工具只有Android 4.2以上有此功能。android
1.打開咱們的手機設置--開發者選項--調試GPU過分繪製(可能有些手機不是這樣的叫法,有的是顯示GPU過分繪製,根據手機而來),選擇顯示過分繪製區域,此時手機頁面會顯示成這樣,不要驚慌。。windows
這裏給你們介紹下,繪製顏色的標識,從好到差:藍色(1x次繪製)-》淺綠色(2x繪製)-》淡紅色(3x繪製)-》紅色(4x繪製)。app
2.怎麼減小過分繪製ide
通常狀況下,最好把繪製控制在2次如下,3次繪製有時候是不能避免的,儘可能避免,4次的繪製基本上是不容許的。工具
怎麼減小繪製是咱們最關心的,咱們來看一個圖(本身項目裏面的。。咱們以圖片下面的ListView爲例子)從圖上看的出來,被繪製3次甚至4次,佈局
咱們來看下代碼:listView和item性能
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 6 <ListView 7 android:id="@+id/xListView" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:layout_marginBottom="50dp" 11 android:background="@color/white" 12 android:divider="@drawable/self_center_divider" 13 android:dividerHeight="4px" 14 android:headerDividersEnabled="false" 15 android:listSelector="@drawable/item_selector" 16 android:scrollbars="none" > 17 </ListView> 18 19 </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <RelativeLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/self_center_item_bg"> <ImageView android:id="@+id/item_img_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="15dp" /> <TextView android:id="@+id/item_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="25dp" android:layout_toRightOf="@id/item_img_view" android:textColor="@color/text_color_darker" android:textSize="15sp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/right_arrow_gray" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="20dp"/> </RelativeLayout> </RelativeLayout>
紅色標記出來的,是問題的所在,背景顏色繪製了三次,最後一個是選擇器,由於有點擊效果,我如今把前2個都給刪掉,只留最後一個,如今咱們看一下圖片。看是否是達到預期的效果。。。。優化
這裏只是一個簡單的例子,當讓有不少緣由組成,咱們能夠從如下幾個方面着手spa
第一:若是是相對比較複雜的佈局,建議使用相對佈局。
第二:若是須要多層嵌套,咱們可使用merge標籤來減小嵌套。
第三:減小背景顏色的屢次繪製
第四:對於使用Selector當背景的Layout(好比ListView的Item,會使用Selector來標記點擊,選擇等不一樣的狀態),能夠將normal狀態的color設置 爲」@android:color/transparent」,來解決對應的問題
第五:當一個頁面有多種不一樣的顯示效果,最多見的是listview 中的多種item佈局,咱們能夠採用抽取的方式
等等。。。。
下面我在爲你們簡單介紹如下Android studio自帶的工具,
首先 打開 Android Device mointor,找到 Hierarychy view (這裏我簡稱 視圖樹)
將你要查看的項目運行到模擬器或者真機上,在Android device mointor 上windows 找到當前的模擬器或者真機,找到當前的項目,
如圖:點擊當前項目某一個佈局,在View裏面會顯示當前這個佈局的各個節點圖,而後點擊3(profile node),在視圖裏面就會顯示4上面的三個點
他們分別表示 測量 佈局 繪製,再次點擊的時候,咱們就能夠看到子節點上着三個圓點在變化,他有3個顏色,綠色,黃色,紅色,紅色表明着耗時最長,也就意味着咱們須要優化,咱們能夠不斷點擊,查看 測量佈局以及繪製所須要的時間,從而優化。。。
就簡單說道這裏,你們能夠研究一下,有點晚了,晚安!!!