android– 为什么Canvas :: drawArc方法绘制不正确的角度?

android– 为什么Canvas :: drawArc方法绘制不正确的角度?,第1张

概述我正试图在android视图中绘制一个180°弧.在onDraw方法中,我使用Canvas::drawArc,如下所示:canvas.drawArc(arcRect,180.0f,180.0f,false,arcBackgroundPaint);正在使用的Paint具有BUTT类型的strokeCap.正如您在下图中看到的那样,弧的末端看起来不太正确.端部从内径到外

我正试图在android视图中绘制一个180°弧.
在onDraw方法中,我使用Canvas :: drawArc,如下所示:

canvas.drawArc(arcRect, 180.0f, 180.0f, false, arcBackgroundPaint);

正在使用的Paint具有BUTT类型的strokeCap.正如您在下图中看到的那样,弧的末端看起来不太正确.端部从内径到外径略微倾斜.

有谁知道为什么会这样?有没有办法解决它除了更改传递给drawArc的值,以便它实际绘制超过180度?这似乎是一个讨厌的黑客,我宁愿避免.

更新:
根据要求,我添加了代码以在弧的底部绘制一条直线.我绘制弧线之前画线,所以线条在后面.我还将弧线设为黑色,以便与线条形成更好的对比.结果如下:


呸.

这是一个关闭线和弧的抗锯齿功能……

解决方法:

如果启用了硬件加速,则会出现drawArc错误的角度问题.

使用真实手机(Nexus 5,AndroID 6.0.1)转载.

如何测试:
将androID:harDWareAccelerated =“false”添加到AndroIDManifest.xml中的应用程序标记.

注意:
在文档中找不到第一个支持的drawArc()API级别,但它的缩放功能来自API17.

硬件加速>画布缩放
https://developer.android.com/guide/topics/graphics/hardware-accel.html

First supported API level
Simple Shapes: 17
Note: ‘Simple’ shapes are drawRect(), drawCircle(), drawoval(), drawRoundRect(), and drawArc() (with useCenter=false) …

更新:
正如PICyourBrain在另一个回答中所写,drawArc()是出现此问题的部分原因.

使用drawPath(),不会发生此问题.

有关信息:
不同的形状,但drawArc()与useCenter = true也似乎安全使用,因为它没有使用硬件加速. (弧的末端和中心与线连接,线看起来笔直.)

Canvas Scaling(上面的相同链接)

First supported API level
Complex Shapes: x

与drawArc()相关的其他Q& As

Canvas.drawArc() artefacts

What’s this weird drawArc() / arcTo() bug (graphics glitch) in Android?

[旧]
我会留下这些信息.

以下是我尝试过的一些测试结果.

更新1-1:

使用模拟器Nexus5 API10,使用arcRect = new RectF(100,100,1500,1400);.


使用模拟器Nexus5 API16,这不会发生.
(不同之处在于(主机端)硬件加速的存在.)

我认为这似乎是一个反别名相关的问题,但无论是否设置了arcBackgroundPaint.setAntiAlias(true)或setDither(true),都会发生这种情况.

注意:这是由错字引起的,抱歉.此测试的arcRect长宽比应为1:1.
使用arcRect = new RectF(100,100,1400,1400);和arcPenWIDth = 200f;

使用arcRect = new RectF(100,100,1500,1300);

1-2:用于比较
使用模拟器NexusOne(480×800,HDPI)API10,使用arcRect = new RectF(100,100,500,500);

更新2:线路扩展.
我首先想到绘制视图可能会导致这种情况,但这也是一个模拟器错误. (不是drawArc()特定的行为.)
对于横向(水平)方向的仿真器API10,会发生这种情况.
线位置的计算似乎被打破了.
请看直线的右端.

final float linestartX = arcRect.left - 250f;final float lineEndX = arcRect.right + 250f;

模拟器Nexus5 API10

水平(API10)

垂直(API10)

2-2:仅供参考
查看视图位置(或绘图位置)的奇怪行为样本超出范围.


更新3:模拟器错误

请参见图片底部.
蓝线是桌面的背景图像.
模拟器Nexus5 API10

更新4:结果似乎取决于风格.
带标题栏

没有标题栏

更新5:结果似乎取决于线宽.

使用arcPenWIDth = 430f(API10,水平)
可以看到右侧略微凹陷.

随着440f

用450f

这是我的(第一个)测试代码.

import androID.content.Context;import androID.graphics.Canvas;import androID.graphics.Paint;import androID.graphics.RectF;import androID.util.AttributeSet;import androID.vIEw.VIEw;final class TestVIEw extends VIEw{    RectF arcRect;    Paint arcBackgroundPaint;    Paint linePaint;    public TestVIEw(final Context context, final AttributeSet attrs)    {        super(context, attrs);        //arcRect = new RectF(100, 100, 500, 500);        arcRect = new RectF(100, 100, 1500, 1500); // fixed (old: 1500, 1400)        arcBackgroundPaint = new Paint();        arcBackgroundPaint.setcolor(0xFFFFFFFF);        arcBackgroundPaint.setStyle(Paint.Style.stroke);        arcBackgroundPaint.setstrokeCap(Paint.Cap.BUTT);        arcBackgroundPaint.setstrokeWIDth(200f);        linePaint = new Paint();        linePaint.setcolor(0xFF00FF00);        linePaint.setStyle(Paint.Style.stroke);        linePaint.setstrokeCap(Paint.Cap.BUTT);        linePaint.setstrokeWIDth(2f);    }    @OverrIDe    protected voID onDraw(final Canvas canvas)    {        super.onDraw(canvas);        canvas.drawArc(arcRect, 180.0f, 180.0f, false, arcBackgroundPaint);        final float linestartX = arcRect.left - 50f;        final float lineEndX = arcRect.right + 50f;        final float lineY = arcRect.centerY();        canvas.drawline(linestartX, lineY, lineEndX, lineY, linePaint);    }}
总结

以上是内存溢出为你收集整理的android – 为什么Canvas :: drawArc方法绘制不正确的角度?全部内容,希望文章能够帮你解决android – 为什么Canvas :: drawArc方法绘制不正确的角度?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1108819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存