如何在Android中的矩形内剪切圆形路径

我已经阅读了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);
}
点赞