使用矢量图形而非位图在画布上绘制路径?

6

目前我正在编写一个小应用程序,允许在给定的图片上手绘。我目前是通过实例化与背景图像相同大小的位图,然后使用该位图创建画布来完成这个操作的。然后在这个画布上进行绘制。

这一切都可以正常工作,但如果将绘图视为矢量数据而不是位图,则用户稍后可以放大而不会出现线条等方面的丑陋步骤,这将更好。

这种可能吗?

2个回答

10
当然可以。有许多课程您会受益,但首先要学习的是Path和Paint。简单来说,对于您绘图中的每条路径,您都会实例化一个Path并调用该Path上的各种方法来添加线条、弧形、矩形等。然后,每个Path都可以添加到您的画布中。每次将Path添加到画布时,您都要指定要使用的Paint对象。Paint对象保存了有关如何在画布上呈现路径的各种信息,包括描边宽度、颜色、是否描边、描边和填充还是只填充等。
使用Paths、Paint等将矢量图形添加到画布非常简单,您可能会很快掌握。我发现一篇名为“Android Vintage Thermometer”的教程是学习的绝佳方式;那是我开始的地方。
一旦您掌握了在画布上绘制直线路径的方法,也许下一步就是将屏幕触摸事件转换为一系列小的直线路径段。
编辑:好的,从您的评论中我现在明白您熟悉Android Path等,并且我错过了重点。现在我理解问题所在:您想要将所有绘制的图形存储为内存中的矢量数据,以便一旦生成路径(响应用户手指触摸),这些路径将以矢量数据的形式保留在内存中,以便可以反复检索并在不同缩放水平或不同旋转角度等情况下绘制到画布上。我目前正在制作一个SVG转换器,作为更大应用程序的一部分。现在,我的SVG转换器旨在仅解析一次SVG文件,并将SVG XML文件中的所有数据转换为相应的路径、画笔、矩阵等。所有这些矢量对象都存储在ArrayLists中。我还使用一个简单的指令集保存到内存中来描述它们从内存中检索出的顺序(但这超出了本文的范围)。要在画布上绘制所有图形,只需按正确顺序从ArrayLists中取出所有Path、Paint、Matrix等对象并应用于画布。这意味着SVG文件的冗长解析仅发生一次;此后,所有矢量图形可以快速重复地以任何比例或变形重新绘制。
现在,SVG和我所讲述的大部分可能都不相关,但我的基本观点是,与我所做的类似,您可以尝试将所有Path对象存储到某种列表中。当用户触摸屏幕并响应生成路径时,除了将这些路径应用于画布外,还将所有单独的路径保留到列表中(例如,ArrayList

谢谢你的总结,但我已经熟悉了Path、Paint和Canvas等。我的问题是:当我在画布上绘制路径时,它明显是基于像素的。感谢教程提示,我会查阅一下! - stk
明白了。我现在已经添加了更多内容到我的答案中,并提出了一些建议。 - Trevor
好的,所以路径对象保存了某种向量数据,这是一个很好的信息!我会根据你的提示进行一些尝试,谢谢! - stk
如何将SVG路径转换为Android路径? - isuru
@Trevor,我们应该把用户的触摸输入保存到SVG中的哪里?我的意思是,如果用户触摸屏幕,我们如何将触摸点(x,y)转换为SVG数据?我们在哪里存储这些数据以便将其呈现回画布? - Hasan Bou Taam

1

看看this的帖子。SVG(微型?)可能符合您的需求。


谢谢,我会看一下! - stk

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