自定義View的硬體加速問題

weixin_33866037發表於2018-04-16

(建立於2017/1/19)

硬體加速

Android 3.0 (API level 11), 開始支援
所有的View 的canvas都會使用GPU,但是硬體的加速會佔有一定的RAM。
在API >= 14上,預設是開啟的,如果你的應用只是標準的View和Drawable,全域性都開啟硬體加速,是不會有任何問題的。
然而,硬體加速並不支援所有的2D畫圖的操作,這時開著它,可能會影響到你的自定義控制元件或者繪畫,出現異常等行為,
所以android對於硬體加速提供了可選性

如果你的應用執行了自定義的繪畫,可以通過在真機上測試開啟硬體加速查詢問題
硬體加速的級別
Application

<application 
    android:hardwareAccelerated="false" 
...>
</application>

Activity

<application 
    android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

Window

getWindow().setFlags(
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Note: 你可以關閉View級別的硬體加速,但是你不能在View級別開啟硬體加速,因為它還依賴其他的設定
兩種獲取是否支援硬體加速的方式

View.isHardwareAccelerated()   //returns true if the View is attached to a hardware accelerated window.
Canvas.isHardwareAccelerated() //returns true if the Canvas is hardware accelerated

如果必須進行這樣的驗證,建議你在draw的程式碼塊中使用:Canvas.isHardwareAccelerated(),因為如果一個View被attach到一個硬體加速的Window上,
即使沒有硬體加速的Canvas,它也是可以被繪製的。比如:將一個View以bitmap的形式進行快取

相關文章