1. 程式人生 > >android學習——控制硬加速 hardwareAccelerated 在3.0才有的。

android學習——控制硬加速 hardwareAccelerated 在3.0才有的。

從Android3.0 (API level11)開始,Android的2D顯示管道被被設計得更加支援硬加速了.硬加速使用GPU承擔了所有在View的canvas上執行的繪製操作.

  啟用硬加速最簡單的的方法是對整個應用啟用硬體速.如果你的應用只使用標準的view和Drawable,全域性啟用硬加速將不會帶來任何負面影響.然而,因為硬加速不是被所有的2D繪製所支援,所以啟用它時可能對你的自定義繪製產生影響.出現的問題經常是不可見的,也可能是異常,或錯誤地顯示了畫素.為了避免這些問題,Android提供了在以下各級別上啟用或禁止硬加速的能力:

Application

Activity

Window

View

  如果你的應用使用了自定義繪製,需要在真實的裝置上啟用硬加速進行測試來找出問題."不支援的繪製操作"一節描述了已知的不能被硬加速的繪製操作以及如何避開它們.

控制硬加速

  你可以在以下級別上分別控制硬加速:

Application

Activity

Window

View

Application級
  在你的manifest檔案中,把以下屬性新增到<application>標籤來對你的整個應用啟用硬加速:

<applicationandroid:hardwareAccelerated="true" ...>

Activity級
  如果你的應用在全域性啟用硬加速時行為不正確,你可以對個別activities單獨啟用硬加速.欲在actvity級別啟用或禁止硬加速,你可以對<activity>元素使用android:hardwareAccelerated屬性.下面的例子在整個應用中啟用了硬加速但對一個activity禁止了硬加速:

<applicationandroid:hardwareAccelerated="true">

<activity... />

<activityandroid:hardwareAccelerated="false" />

</application>

Window級
  如果你需要更高顆粒度的控制,你可以使用以下程式碼為一個window啟用硬加速:

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注:現在你還不能在window級別禁止硬加速.


Viewlevel

你可以在執行時使用以下程式碼禁止個別的View的硬加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);


注:當前你不能在View級別啟用硬加速.View層有除禁止硬加速之外的其它功能.

判定一個View是否能被硬加速

  有時一個應用瞭解是否啟用了硬體速是很有用的,對那些自定義View之類的東西尤其重要.在你的應用做了一些不被最新的管線所支援的自定義繪製時這更加重要.

  有兩種方法可以檢查應用是否被硬加速:

View.isHardwareAccelerated():如果View附加到一個硬加速的window上就返回true.

Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.

  如果你必須在你的繪製程式碼中做這個,應使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().當一個view附加到一個硬加速的window上,它仍可以使用非硬體速的Canvas進行繪製操作.比如當為了快取記憶體而把一個view畫到一個bitmap中.