Android 从 API 级别 11 开始支持硬件加速。问题是当硬件加速开启时,并非所有绘图操作都受支持。 Canvas.clipPath 就是其中之一。不支持的操作的完整列表可以找到here
您可以尝试在不使用clipPath 的情况下实现您想要的功能,或者只禁用硬件加速。
要在应用程序级别禁用硬件加速,请确保您拥有targetSdkVersion 11 或更高版本,并在AndroidManifest 中使用hardwareAccelerated 标签:
<application android:hardwareAccelerated="false" ...>
您可以使用以下方法仅为特定视图禁用硬件加速。
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void enableHardwareAcceleration(View view, boolean enabled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (enabled) {
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
}
}
注意必须使用TargetApi注解并检查设备android版本是否为Honeycomb或更高,否则Eclipse可能会产生错误。
如果您的问题中的代码不起作用,请尝试用以下代码替换它:
@Override
protected void dispatchDraw(Canvas canvas) {
Path path = new Path();
int count = canvas.save();
path.addCircle(400,200,100,Direction.CW);
canvas.clipPath(path);
super.dispatchDraw(canvas);
canvas.restoreToCount(count);
}