博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Canvas 硬件加速引起的clipPath失效问题
阅读量:7237 次
发布时间:2019-06-29

本文共 1455 字,大约阅读时间需要 4 分钟。

hot3.png

自定义View时,可以通过Canvas裁剪画布实现圆角的效果。

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        path = new Path();        path.addCircle(100 + bmpWidth / 2, 100 + bmpHeight / 2, bmpWidth / 2, Path.Direction.CW);                canvas.drawPath(path, paint);        canvas.save();        canvas.clipPath(path);        canvas.drawBitmap(bitmap, 100, 100, paint);        canvas.restore();    }

在4.3以下运行,无法显示裁剪效果。

这是由于开启了硬件加速导致的。

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

Hardware acceleration is enabled by default if your Target API level is >=14, but can also be explicitly enabled.

硬件加速从Android 4.0 (API level 14)开始默认是打开的。

但clipPath从18开始才支持。

所以需要关闭硬件加速。

不要在manifest的application标签或者activity标签中设置属性android:hardwareAccelerated="false",这样会导致界面不流畅。

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

 

不过遇到个另外的问题,在API18上,也显示不正常的情况。

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        path = new Path();        path.addCircle(100 + bmpWidth / 2, 100 + bmpHeight / 2, bmpWidth / 2, Path.Direction.CW);                canvas.drawPath(path, paint);        canvas.save();        canvas.clipPath(path);        canvas.drawBitmap(bitmap, 100, 100, paint);        canvas.restore();        canvas.drawBitmap(bitmap, 600, 100, paint);    }

当canvas上再绘制同一个bitmap时就又不正常了

当addCircle的第三个参数值不一样时,有时显示也不正常,还需要关闭硬件加速。

不知道是不是Android的bug,还是我处理的不正确。

转载于:https://my.oschina.net/android520/blog/1622983

你可能感兴趣的文章
【Android UI】:Fragment官方文档
查看>>
平时收藏网页
查看>>
AE视频制作 参考 资源 科幻科技风格 开场 公司企业宣传
查看>>
数据仓库概念
查看>>
简单计算器的实现
查看>>
iptables4张表5条链
查看>>
关于IE8上传文件的一些问题
查看>>
RDD的缓存,依赖,spark提交任务流程
查看>>
wdcp后台创建网站后,总是显示403界面
查看>>
screen
查看>>
[并查集]JZOJ 5794 旅行
查看>>
三、自定义Toast (可以播放音乐)
查看>>
db2许可证安装
查看>>
jquery中attr与pror
查看>>
二进制实现加减乘除
查看>>
NOIP 2011 计算系数
查看>>
三色旗
查看>>
点是否在圆内
查看>>
override和重载的区别
查看>>
如何让一个类不能被实例化
查看>>