Android4.0 开启硬件加速后部分应用运行出错。


出现异常:


12-20 15:18:19.543: E/AndroidRuntime(26301): FATAL EXCEPTION: main
12-20 15:18:19.543: E/AndroidRuntime(26301): java.lang.UnsupportedOperationException
12-20 15:18:19.543: E/AndroidRuntime(26301): at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:429)
12-20 15:18:19.543: E/AndroidRuntime(26301): at cn.hpc.ui.MyView.drawArea(MyView.java:66)


关闭硬件加速则运行正常。


原因在这里

http://developer.android.com/guide/topics/graphics/hardware-accel.html

Hardware Acceleration


Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline is designed to better support hardware acceleration.

从Android 3.0(API Level 11)开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制操作。

... ...


Unsupported Drawing Operations

不支持的绘图方法:

  • Canvas
    • clipPath()
    • clipRegion()
    • drawPicture()
    • drawTextOnPath()
    • drawVertices()
  • Paint
    • setLinearText()
    • setMaskFilter()
    • setRasterizer()
  • Xfermodes
    • AvoidXfermode
    • PixelXorXfermode
我的应用中,正好用到第一种 clipPath.所以运行出错。

问题找到,

解决方法:

有4种控件硬件加速的方法。


1 Application level

In your Android manifest file, add the following attribute to the<application>tag to enable hardware acceleration for your entire application:

在应用程序AndroidManifest.xml文件中,为application标签添加如下的属性即可为整个应用程序true开启、false关闭硬件加速

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


2 Activity level

在应用程序AndroidManifest.xml文件中,只需在activity元素中添加 android:hardwareAccelerated 属性即可。 例:在application级别开启硬件加速,但在activity上关闭硬件加速。
<application android:hardwareAccelerated="true">    <activity ... />    <activity android:hardwareAccelerated="false" /></application>

3 Window level

If you need even more fine-grained control, you can enable hardware acceleration for a given window with the following code:

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

Note: You currently cannot disable hardware acceleration at the window level.


4 View level

You can disable hardware acceleration for an individual view at runtime with the following code:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);


测试中第1, 2 中都无效,第3种只能开启硬件加速,而不能关闭硬件加速。
只有第4种适合。只对当前View关闭硬件加速。 优点:View中使用到上述硬件加速不支持的方法时,强制关闭硬件加速。其它地方,由系统决定是否硬件加速。




更多相关文章

  1. [Android]Android(安卓)FTP Server
  2. How to change an Android(安卓)app's name?
  3. android 应用自动升级
  4. suse linux android sdk 下载.安装.配置
  5. android 常用intent
  6. Android之Input子系统事件分发流程
  7. Google Android(安卓)应用程序结构
  8. android应用程序跳转到系统的各个设置页面
  9. 如何以编程方式退出android应用程序

随机推荐

  1. Android 获取通话记录
  2. Android 沉浸式全屏(StatusBar,Navigation
  3. How to build Android Windows SDK
  4. android上传视频
  5. Android XUtils的cookie
  6. Android 读写文件整理
  7. android editText 输入字数限制
  8. Android(安卓)ListView 如何 更改字体颜
  9. 一、手动配置Android(安卓)SDK环境
  10. Android(安卓)pdf viewer在android studi