我已经阅读了20多个问题/答案,但我仍然无法得到我想要的东西.我想在矩形内切一个圆圈,如下所示:
这是我的代码:
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setARGB(180, 0, 0, 0);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
Path circularPath = new Path();
circularPath.addCircle(getWidth() / 2, getHeight() / 2, radius, Path.Direction.CCW);
canvas.clipPath(circularPath, Region.Op.REPLACE);
canvas.drawColor(0x00000000);
}
我的背景(setARGB)显示正确,但没有任何内容被剪裁.我还尝试了除REPLACE之外的其他Op值,强制软件光栅化(因为我读过一些Android版本的clipPath不支持某些Ops),通过调用setLayerType(LAYER_TYPE_SOFTWARE,null);在构造函数上,但无济于事.我如何达到预期的效果?
注意:我的最低SDK版本是15,因此我不需要支持低于4.0的任何内容.
最佳答案 尝试在dispatchDraw()中剪切路径:
@Override
protected void dispatchDraw(Canvas canvas)
{
canvas.clipPath(mClipPath, mRegion); // previously created path & region
super.dispatchDraw(canvas);
}
从onDraw方法中删除路径剪辑代码,应该这样做.
编辑:
创建路径时,请确保仅在测量发生后执行此操作,例如:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mClipPath.reset();
float radius = Math.min((float)getMeasuredWidth() / 2f, (float)getMeasuredHeight() / 2f) + 5;
mClipPath.addCircle((float)getMeasuredWidth() / 2f, (float)getMeasuredHeight() / 2f, radius, Path.Direction.CCW);
}