我正试图在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方法绘制不正确的角度?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)