問題
在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
android:hardwareAccelerated="true"
<activity android:name=".view.activity.LeadActivity"
android:hardwareAccelerated="false"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/MyTheme">
</activity>
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
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是否打開了硬件加速