android – Canvas.drawArc()artefacts

我在自定义视图中在画布上绘制弧,如下所示.绘制和矩形在onDraw()之外定义,并在其中添加以简化目的.
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已经绕过了这个bug.可能除了315.0f以外的任何其他值都可以做到.

如果涉及代码优化(尝试以尽可能小的线段绘制弧),另一个可能有效的技巧是通过将弧切成碎片来简化弧 – >使用多个drawArc调用,每个调用跨越一定的最大角度.考生分别为30度,45度,90度和180度.如果关节不可见,仍然有待观察……

这是一个很长的镜头,希望这些建议中的任何一个都可行.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...