我们知道,android中的图形都是矩形的。
要绘制一个如下的椭圆形控件(圆形图像,圆角listview,圆角按钮),我们需要裁剪画布
在4.4一下的设备上 使用canvas.clipPath裁剪画布以使得控件中绘制的内容能被不规则化
//裁剪画布
mContentRect.set(0, 0, getWidth(), getHeight());
mPath.addRoundRect(mContentRect, r/2,r/2, Path.Direction.CCW);
canvas.clipPath(mPath,android.graphics.Region.Op.REPLACE);
//绘制其他控件元素,灯泡 文字 背景
但是 在部分真是设备中,它的效果缺是这样的
裁剪失效,有没有?
问题在于canvas默认开启了硬件加速
硬件加速具体的介绍见官方文档
http://developer.android.com/guide/topics/graphics/hardware-accel.html
下面是硬件加速不支持的API和SDK等级对照表
API level | ||||
< 17 | 17 | 18 | ||
Support for large scale factors | ||||
drawText() | ✗ | ✗ | ✓ | |
drawPosText() | ✗ | ✗ | ✗ | |
drawTextOnPath() | ✗ | ✗ | ✗ | |
Simple Shapes* | ✗ | ✓ | ✓ | |
Complex Shapes* | ✗ | ✗ | ✗ | |
drawPath() | ✗ | ✗ | ✗ | |
Shadow layer | ✗ | ✗ | ✗ |