自定義View起步:硬件加速對繪圖的影響

問題

    在Android API 11之後,開始支持硬件加速,所有的ViewCanvas都會支持GPU,但是硬件加速會佔用一定的RAM資源。在API 14(Android 4.0)之後默認是全部開啓硬件加速的,如果你的應用全部都是標準的View和Drawable,全局都打開硬件加速是不會有問題的。然而硬件加速並不是支持所有的2D圖形繪製操作,在Android4.0之後的設備上,有時候我們定製了比較複雜的自定義View,我們的view在刷新的時候有可能會出現花屏或者某些View錯位的情況。

通過Logcat分析會出現這樣的錯誤:

09-18 14:34:39.656: DEBUG/OpenGLRenderer(3104): GL error from OpenGLRenderer: 0x501

從這個日誌可以分析出,初步認爲可能是硬件加速導致的問題。

硬件加速的優點和缺點

    硬件加速能能夠使用GPU來加速2D圖形的渲染操作,但是硬件加速並不能支持所有的渲染操作。針對自定義的View有可能會出現渲染錯位的情況,如果有自定義的View,在開啓硬件加速的設備上操作,出現渲染問題,我們可以關閉硬件加速。

開啓和關閉硬件加速

    由於硬件加速可能會給我們帶來的問題,google爲我們提供了4種級別的控制

      

  • Application
  • Activity
  • Windows
  • View
    Application級別控制
  
  android:hardwareAccelerated="true"
  
    Activity級別控制
    Activity可以針對單個的Activity進行硬件加速的控制
   
 <activity android:name=".view.activity.LeadActivity"
                  android:hardwareAccelerated="false"
                  android:configChanges="keyboardHidden|orientation|screenSize"
                  android:theme="@style/MyTheme">

        </activity>
   
   Window級別控制
 
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  注意:window級別的硬件加速只能打開,不能關閉。

  View級別的控制
  view級別只能關閉不能打開。
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

或者使用android:layerType="software"來關閉硬件加速:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingLeft="2dp"
    android:layerType="software"
    android:paddingRight="2dp" >

如何判斷一個View是否打開了硬件加速

       View.isHardwareAccelerated()如果返回的是true,表示使用了硬件加速   ,Canvas.isHardwareAccelerated(),如果返回true表示這個圖層開啓了硬件加速


   更佳詳細的介紹請參見我的微信公衆號,掃描左側二維碼關注我把。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章