android - 使用矢量图形而不是位图在 Canvas 上绘制路径?

标签 android

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

一切正常,但将绘制图形作为矢量数据而不是位图会更好,这样用户以后可以放大而不会在线条等中出现丑陋的步骤等。

这有可能吗?

最佳答案

当然。您可以从学习中受益的类(class)有很多,但首先要学习的两个类(class)是 Path 和 Paint。基本上,对于绘图中的每个单独路径,您将实例化一个路径并调用该路径上的各种方法来添加直线、圆弧、矩形等。然后,每个路径都可以添加到您的 Canvas 中。每次向 Canvas 添加 Path 时,您都指定了要使用的 Paint 对象。 Paint 对象包含有关路径实际应如何在 Canvas 上呈现的各种信息,包括笔划宽度;颜色;是描边、描边和填充,还是只填充;等等。

使用 Paths、Paint 等将矢量图形添加到 Canvas 非常简单,您可能会在短时间内掌握窍门。我发现名为 Android Vintage Thermometer 的教程是一种极好的学习方式;这是我开始的地方。

一旦您掌握了绘制通往 Canvas 的直线路径的窍门,也许下一步就是将您的屏幕触摸事件转换为一系列小的直线路径段。

编辑:

好的,根据您的评论,我现在了解到您熟悉 Android Path 等,但我没有捕获要点。现在我明白了这个问题,我想:你想要做的是将所有绘制的图形作为矢量数据存储在内存中,这样一旦生成了路径(响应用户手指触摸),这些路径将被保留在内存中作为矢量数据,以便可以一遍又一遍地检索它们,并以不同的比例(缩放级别)或不同的旋转等将它们绘制到 Canvas 上。

我目前正在开发一个 SVG 转换器,作为一个更大应用程序的一部分。现在,我的 SVG 转换器设计为仅解析 SVG 文件一次,将 SVG XML 文件中的所有数据转换为相应的路径、绘画、矩阵等。所有这些矢量对象都存储在 ArrayLists 中。我还使用保存到内存中的简单指令集来描述从内存中检索它们的顺序(但这超出了本文的范围)。要将所有图形绘制到 Canvas 上,所有 Path、Paint、Matrix 等对象都以正确的顺序从 ArrayList 中拉回并应用于 Canvas。这意味着 SVG 文件的冗长解析只发生一次;此后,所有矢量图形都可以以我希望的任何比例或转换快速地一遍又一遍地重新绘制。

现在,SVG 和我在那里进行的大部分内容可能无关紧要,但我的基本观点是,就像我所做的一样,您可以尝试将所有 Path 对象存储到某种列表中。当用户触摸屏幕并且您生成路径作为响应并将这些路径应用到 Canvas 时,您还将所有单独的路径保留到列表中(例如 ArrayList<Path> )。也许单独的路径可以与它们各自的 Paint 对象配对保存,Paint 对象描述了在绘制特定路径时选择的特定颜色、笔触宽度等。每当用户选择放大或缩小(或任何其他需要重新绘制 Canvas 的事件发生)时,您只需从内存中重放所有这些路径并将它们写入 Canvas 。作为进一步的简化,如果只允许用户使用单个 Paint 配置(例如,如果只允许用户绘制白线,例如,无法控制宽度),您甚至可以存储用户绘制的所有路径一个单独的 Path 对象,在绘制每个路径时使用 myPath.addPath(newPath) 添加每个路径。

关于android - 使用矢量图形而不是位图在 Canvas 上绘制路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952300/

相关文章:

android - 如何让画廊像翻书一样?

android - 滚动时不绘制 subview ?

android - Cordova/jQuery - 确定您的应用程序是在 Web/移动浏览器还是移动应用程序 (Android/iOS) 上运行

java - 如何将下面的android方法转换为递归方法?

java - 从maven central获取bot-java lib的方法是什么

android - RabbitMQ 与 GAE

android - 找不到与 com.google.android.gms :strict-version-matcher-plugin:[15. 0.0、16.0.0 匹配的任何版本)

Android - 具有右对齐 View 的椭圆大小

android - 用于 Cordova 澄清的 Google Cloud Messaging

iphone - 如何将纹理映射到曲面上?