用特定像素宽度绘制一条线

10
我想在画布上使用线条显示X/Y数据,并设置一定宽度(以像素或“dp”为单位)。我已经尝试使用Paint的setStrokeWidth(..)方法,确实可以改变线宽,但这不是我需要的。在我的情况下,我使用matrix.preScale(xScale,yScale)将画布缩放到“真实工程单位”,因此X比例表示0到100,而Y表示0到1。Paint对象的setStrokeWidth()方法似乎设置了笔触,使其遵循我的矩阵preScale()设置。换句话说,水平线绘制得非常细,而竖直线则绘制得非常粗。
是否有一种方法可以配置Paint,以便无论线条绘制方向如何,其宽度都是一致的像素数量?
我已经尝试定义一个Drawable,它是一条线,并从中创建一个ShapeDrawable,然后将其应用于Paint,但在运行时遇到了一些难看的类转换错误。这让我认为这是错误的方法。但也许我放弃得太快了。
我了解到有许多Android绘图/图表软件包可用,其中一些带有源代码,但我真正想了解的是平台,而不是使用第三方解决方案。
谢谢任何提示! Rich

很好的问题。我不知道,但祝你好运。 - Jim Blackler
1
我认为你不应该在单位适配中使用矩阵。每个绘图操作通常使用相同的管道,最终得到一个形状,然后进行变换和光栅化。因此,修改后的矩阵会影响任何绘图操作的最终结果,从而扭曲线条笔画,如果使用不同的轴单位。因此,对于正确绘制图形,应该在将坐标传递给Android绘图方法之前按照所需比例缩放坐标。否则,您将无法绘制正确的线条和文本。 - dronus
抱歉,大家关于重复发布的问题。FireFox 3似乎与stackoverflow表单不兼容。 - Rich
除了dronus,我建议您查看MapView组件中的getProjection()。它基本上将一组屏幕坐标转换为您想要的投影(在这种情况下是地图坐标或纬度/经度点)。类似的方法也可以使用,这意味着您不必处理绘图矩阵。 - JQCorreia
我认为最终的答案是,没有办法。dronus的想法是做自己的缩放(绕过矩阵缩放),这对我很有效。感谢JQCorreia提供的投影建议,这个想法将可能很丑陋的缩放隐藏在一个漂亮的界面中。 - Rich
显示剩余2条评论
2个回答

11
例如在Android上:paint.setStrokeWidth(3); 这个方法设置线宽。在这种情况下,线宽为3像素。我正在寻找类似于BlackBerry的这种方法。
试试这个:
    Graphics.setColor(Color.RED);
    Graphics.setStrokeWidth(20);
    Graphics.drawRect(0, 0, 100, 100);

它们可以在net.rim.device.api.ui.Graphics包中找到。


0

在绘制地图叠加层时,我曾经做过类似的事情。

由于用户可以使用多点触控动态缩放地图,在进入绘制程序时,我计算了x轴和y轴的缩放因子,将其应用于画布上,绘制地图,然后反转此缩放因子,并将其应用于叠加层的线宽。 因此,画布被缩放,叠加层也被缩放,然后进行反缩放处理,以实现固定宽度效果。

我发现这种方法非常有效,而且没有明显的性能影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接