clipPath 使用硬件加速的注意事项 会造成显示异常

文章探讨了在Android应用中配置硬件加速后,使用图片剪裁功能时遇到崩溃的问题,分析了原因在于特定版本的SDK中Canvas.clipPath函数未实现此功能。建议将涉及到此操作的Activity配置为不使用硬件加速来解决冲突。

为提高app的整体性能,在manifest文件中配置的时候,有可能会启动硬件加速,如下

Xml代码  收藏代码
  1. android:hardwareAccelerated="true"  

 

配置后,发现设备在4.0.4与4.0.3这样的版本上使用图片剪裁功能的时候会crash,捕获到的异常信息如下

Java代码  收藏代码
  1. java.lang.UnsupportedOperationException at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:429)  

 

查询代码发现,在图片剪裁的时候有使用到Canvas.clipPath(path, Region.Op.DIFFERENCE);这个函数

作为Canvas的一个实现类GLES20Canvas,在使用硬件加速的时候会被使用到。

查询GLES20Canvas的源代码,发现在4.0.4与4.0.3这两个版本中,clipPath的实现均为如下代码

Java代码  收藏代码
  1. public boolean clipPath(Path path, Region.Op op) {  
  2.          throw new UnsupportedOperationException();  
  3.  }  

 直到4.1.1这个版本,sdk中的才进行了具体的实现

Java代码  收藏代码
  1. @Override  
  2. public boolean clipPath(Path path, Region.Op op) {  
  3.          // TODO: Implement  
  4.          path.computeBounds(mPathBounds, true);  
  5.         return nClipRect(mRenderer, mPathBounds.left, mPathBounds.top,  
  6.                 mPathBounds.right, mPathBounds.bottom, op.nativeInt);  
  7.      }  

 也就是说,在使用Canvas.clipPath的时候必须要特别注意如果app要使用硬件加速,应该把涉及clipPath的Activity排除在外,配置方法是:

在manifest中activity的配置处配置android:hardwareAccelerated ="false"




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值