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

版权声明:本文作者为BlueLzy,原出处为CSDN博客 - http://blog.csdn.net/blue_zy,转载请注明出处。 https://blog.csdn.net/blue_zy/article/details/79332852

需求

绘制曲线图,由于不太会贝塞尔曲线,因此选择了绘制折线,再加上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层级禁用硬件加速即可。

没有更多推荐了,返回首页