我在自定义 View 中的 Canvas 上绘制弧线,如下所示。 PaintrectangleonDraw()之外定义,并在其中添加以简化操作。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    RectF rectangle = new RectF(60f, 60f, 480f, 480f);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(0x40000000);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(120);

    canvas.drawArc(rectangle, 225f, 315f, false, paint);
}

当我在带有4.3的Galaxy Nexus上运行此代码时,会出现以下伪影。

不过,在带有4.4.4的Nexus 5上运行时,没有这种伪像。

我仅通过(225f,315f)等角度和其他一些角度观察到了这些伪像。大多数情况下,弧的形状正确。

有办法避免这些伪影吗?

更新:我尝试使用setLayerType()使用软件,硬件,但没有使用任何层。文物改变了形式,但仍然存在。

最佳答案

我是StackOverflow的新手,想添加评论,但无法(积分不足),因此必须将我的评论放入答案中!

一件奇怪的事是,圆弧在外侧以垂直的直线超过了指定的终点位置。内在的终点似乎还可以。当然,这和其他困惑情况并不能说明导致问题的原因。

当结束角度为精确为的90度的倍数时,似乎会出现。这看起来像是数值计算错误,浮点舍入问题等。@ kcoppock指出314.98f已经绕过了该错误。可能是,而不是315.0f之外的任何值都可以解决问题。

如果涉及代码优化(尝试以尽可能小的线段绘制圆弧),另一个可行的技巧是通过将圆弧切成 fragment 来简化圆弧->使用多个drawArc调用,每个调用跨越一定的最大角度。候选人分别是30度,45度,90度和180度。如果关节不可见还有待观察...

这是一个漫长的过程,希望这些建议中的任何一条都能奏效。

10-08 17:10