自定义view使用硬件加速导致绘制异常

需求

绘制曲线图,由于不太会贝塞尔曲线,因此选择了绘制折线,再加上cornerPathEffect的效果来实现。

报错

在高端机上会出现曲线图错位,因为使用机器默认开启了硬件加速
而导致错位的正是下面这句代码:

CornerPathEffect cornerPathEffect = new CornerPathEffect(45);

原因

要想解决这个问题,首先我们要了解什么是硬件加速

从Android 3.0开始(API L11),Android开始全面使用硬件加速来进行2D渲染,硬件加速是指Android中在View上进行绘制的图形图像都使用GPU来进行绘制,使用硬件加速,在大部分时候都让绘制更加流畅,但付出的代价是需要消耗更多的内存资源。

硬件加速在API L14之上是默认开启的,对于基本的View绘制,通过硬件加速可以增加绘图的流程性,但是要注意的是,并不是所有的2D图形绘制API都支持硬件加速。

通过开发者选项中的“强制进行GPU渲染”,用户可以为全局打开硬件加速。在3.0 以上的Android中,系统已经对大部分动画都进行了硬件加速。

Ok,了解什么是硬件加速以后,我们需要看看哪些属性是不支持硬件加速的

这里写图片描述
这里写图片描述

可以看到
CornerPathEffect这个属性是不支持加速的,找到了bug的原因,下面我们就看看怎么才能解决。方法就是,禁用硬件加速。

解决

硬件加速,可以在以下几个层面来设置:

Application
<application android:hardwareAccelerated="true" ...>
Activity
<application android:hardwareAccelerated="true">  
<activity ... />  
<activity android:hardwareAccelerated="false" />  
</application>  
View
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

像我在项目里遇到的问题,直接在View层级禁用硬件加速即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值