ShapeDrawable 以编程方式绘制圆形切边

ShapeDrawable to draw circle programatically chopping the sides

我想在 PreviewView 上点击画一个相机对焦圈。所以,我写了一些代码来画一个圆圈,如下所示

val sd = ShapeDrawable(OvalShape())
            sd.paint.color = Color.parseColor("#ffffff")
            sd.paint.style = Paint.Style.STROKE
            sd.paint.strokeWidth = 20f

            var img: ImageView = ImageView(this);
            img.background = sd

            val params = FrameLayout.LayoutParams(250, 250)
            params.leftMargin = event.x.toInt() - 125
            params.topMargin = event.y.toInt() - 125

            idFocusIndicator.removeAllViews()
            idFocusIndicator.addView(img, params)

你可以在下面清楚地看到它是如何在所有四个边上切割圆的边

我需要一个清晰的圆圈而不是砍掉一个!如何实现?

好的,经过一番研究后,我用 GradientDrawable 替换了 ShapeDrawable,它起作用了。

但是,我不知道为什么 ShapeDrawable 有问题。如果有人知道请在这里评论。

val shape = GradientDrawable()
            shape.setShape(GradientDrawable.OVAL)
            shape.setColor(Color.TRANSPARENT)
            shape.setStroke(20, Color.WHITE)

这看起来与 the one here 的问题相同。当您以编程方式而不是在 XML 中创建 ShapeDrawable 时,它​​会将笔划宽度的中心放在 canvas 的边缘,因此您的笔划宽度的一半将被裁掉。如果您不能使用 XML,您可以使用 LayerList 为您的可绘制对象提供一个插图,这样边缘就不会被裁掉。

float strokeWidth = 20f;
val sd = ShapeDrawable(OvalShape()).apply {
    paint.color = Color.parseColor("#ffffff")
    paint.style = Paint.Style.STROKE
    paint.strokeWidth = strokeWidth
}
val layerDrawable = LayerDrawable(arrayOf(sd)).apply {
    val inset = strokeWidth / 2f
    setLayerInset(0, inset, inset, inset, inset)
}
val img: ImageView = ImageView(this)
img.background = layerDrawable