版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hnzcdy/article/details/68496836


问题

在Android API 11之后,开始支持硬件加速,所有的ViewCanvas都会支持GPU,但是硬件加速会占用一定的RAM资源。在API 14(Android 4.0)之后默认是全部开启硬件加速的,如果你的应用全部都是标准的View和Drawable,全局都打开硬件加速是不会有问题的。然而硬件加速并不是支持所有的2D图形绘制操作,在Android4.0之后的设备上,有时候我们定制了比较复杂的自定义View,我们的view在刷新的时候有可能会出现花屏或者某些View错位的情况。
通过Logcat分析会出现这样的错误:

  1. 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级别控制

    1. android:hardwareAccelerated="true"

    Activity级别控制

    Activity可以针对单个的Activity进行硬件加速的控制 ```
  1. <activity android:name=”.view.activity.LeadActivity”
  2. android:hardwareAccelerated=”false”
  3. android:configChanges=”keyboardHidden|orientation|screenSize”
  4. android:theme=”@style/MyTheme”>
    1. <a name="Iv3y8"></a>
    2. ## Window级别控制
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
    1. 注意:window级别的硬件加速只能打开,不能关闭。
    2. <a name="jMzhF"></a>
    3. ## View级别的控制
    4. view级别只能关闭不能打开。
    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    1. 或者使用 `android:layerType="software"` 来关闭硬件加速:
  5. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android
  6. android:layout_width=”fill_parent”
  7. android:layout_height=”fill_parent”
  8. android:orientation=”vertical”
  9. android:paddingLeft=”2dp”
  10. android:layerType=”software”
  11. android:paddingRight=”2dp” > ```

    如何判断一个View是否打开了硬件加速

    View.isHardwareAccelerated() 如果返回的是true,表示使用了硬件加速,
    Canvas.isHardwareAccelerated(),如果返回true表示这个图层开启了硬件加速