Android使用SVG矢量图打造酷炫动效!

enzoys 16 0

安卓有什么软件可以用于画矢量图的

首先是SKETCH *** OOK不能画矢量 。

安卓市场上也有很多矢量画图,不过感觉都有很烂, *** 的要用的话只推荐2个吧

盘点2022十大 *** 绘画工具,随时随地记录灵感

*** 绘画软件可以让你随时随地记录灵感,是非常好用的 *** 常工具,尤其对于学习绘画的同学来说。那么你知道主流的 *** 绘画软件有那些吗?今天就给大家盘点下,其中有Sketch *** ook妙笔生花、爱笔思画X、Procreate Pocket等。这些都是当下 *** 较好用的绘画App,其中有的软件部分功能免费,有的收费,具体的还要看个人需求。

1、Sketch *** ook妙笔生花

当下 *** 画画软件市场中占有率更高、功能最完 *** 、体验更好的绘画应用之一。用户可在iOS、安卓、macOS和Windows平台中 *** 。Sketch *** ook兼顾易上手与专业性,无论面向专业插画师还是初学者,都能很好地满足不同人群的绘画需求。

2、爱笔思画X

一款著名流行的多功能 *** 绘画软件app,提供0多种画笔、多种字体、多种材料、46种网纹、80种滤镜、27种混合模式、记录绘图过程、描边稳定功能,各种标尺功能,包括径向线标尺或对称标尺,以及剪贴蒙版功能。

3、Procreate Pocket

Procreate Pocket是Procreate的 *** 版,简单易用,可满足专业创作人员或艺术爱好者的创作需求。现提供数百种手动画笔、一套创意艺术工具、一套高级图层 *** 和全新的Valkyrie绘图引擎,能够帮助你创作出迷人的素描、漂亮的图画、精美的插图和美妙的动画。

4、Medi *** ang paint Pro

一款可以绘制出精美漫画或插画的绘图软件,也是 *** 绘画软件免费平台,能够在iOS、安卓,以及win、mac四个平台上使用。其笔刷功能很强大,搭载表现原稿质感的G笔尖、圆笔尖,以及可混色水彩等18种笔刷,能够轻松画出各种线条,并依据个人喜好调整。

5、Illustrator Draw

可帮助你在移动设备上绘画出矢量图形,提供多种形状的笔刷,每种都可以对大小、颜色透明度等进行调节。当然也有图层的设定,从而绘制出更复杂的图像。除了绘制图形,也可以在软件的Community Drawings中欣赏其它用户上传到 *** echance上的矢量画。

6、Paper

一款可随时记录创意的沉浸式素描应用,拥有超过万名用户在这里素描、记笔记、起 *** 、画示意图、上色等。软件采用简洁的界面和手势导航,创作空间不受控件和滑块影响。Pencil和触控功能让用户无需切换模式,即可随心绘图、剪裁和移动。还可以通过拖拽轻松重排页面、将笔记和素描组合起来、为照片添加注释,又或是通过手势撤销 *** 作,以防中断思路。

7、画世界

一款功能非常强大的绘画软件,拥有绘画爱好者创作交流社区,注重原创保护、注重社区氛围。创作方面,软件提供专业的绘画工具——可自定义分辨率的画布、多种 *** *** 画笔、超多可用图层、高级图层混合选项、压力感应、快速图形工具等等。还支持多人同时绘画,支持导出MP4、GIF和动画序列帧等。

8、概念画板

提供免费版本和付费版本,免费版本的功能包括精美绝伦的Copic色轮、灵活强大的笔刷工具、5张图层、无限大画布和JPG导出功能等。作为更好的十大 *** 画画软件之一,概念画板App的用户群来自各行各业,包括迪士尼、飞利浦、惠普、苹果、谷歌、Playstation、Google、Unity等公司的 *** 设计师。

9、Infinite Painter无限绘画

iOS端评分较高的绘画App,同时也提供安卓版本。软件的界面十分简洁,组织有序,使用方便,集各种功能于一体,包括但不限于:图层和Photoshop混合模式、使用五种不同的 *** 导向工具绘制三维城市景观、使用导向工具建立简洁线条、选择和剪切蒙板、变换工具、同时变换多个图层、使用图案工具创建无缝图案、液化工具等等。

10、Zen *** rush 3

一款主打“水墨画”的 *** 绘画软件app,其绘画 *** 模拟 *** 水墨笔的3D模型,可以实现各种自然的笔刷处理;通过调节墨中水量,能够实现非常专业的边缘效果“渗透”“模糊”等色彩混合的表现形式;提供30种精选的 *** 本传 *** 色彩,用来创作彩色墨水画和水彩画。熟练使用丰富的背景风格模板,创作和分享大气的艺术作品。

喜欢的同学可以下载试试,如遇收费看个人具体需求,再做选择。

大家知道,能使用手绘板在 *** 上画画的,绘画APP吗?(安卓 *** 哦)?

我,一个非美术设计专业出身,目前作为一个 *** 画画这门手艺来赚点副业收入的插画师,斗胆来写一写使用过的pad绘画应用。在体验过几个画画APP之后,用的最顺手的,当然还是procreate。但是,由于procreate太火了,网上攻略很多就不多说了。下面,我会来挑几个有特色的或者相对小众的APP来说一说,希望对大家有一丢丢的帮助。国外版:Vectornator 特色:如果在pad上做矢量图,这款是最友好地选择。如果你对 Illustrator有一些基本了解,这个上手非常快, *** 作也 *** Illustrator简单多了。如果你想学习矢量插画,里面还有不少案例,可以挨个点击看到图层,你可以很快了解其中绘画逻辑,这也是一种教程方式吧。之前要付费的,目前已经免费了。 *** :免费 难度等级:6-10亮点: 1. Vectornator 擅长平面设计和矢量绘图,定位类似于 Ado *** e Illustrator。 2. *** 作界面简洁,逻辑清晰,易上手,非常友好。 3. 内置若干案例,可以单个点开查看所有图层,方便学习。 4. 支持与illustrator cc间自由导出导入作品和素材。 5. 强大的内置符号库, Icons8 有 0+个图标,可直接搜索到。 6. 采用了超快渲染引擎,实现桌面级性能,能让设备发挥更高性能。评分:⭐️⭐️⭐️⭐️⭐️

Astropad Studio特色:我喜欢它更大的特点是Ipad和Mac的不延迟同步显示,就是你在Ipad上画的每一笔已经在Mac上可见了,而且分辨率一样,这样方便掌控细节。 *** :每月11.99美元或每年79.99美元,有30天免费试用期。难度等级:7-10亮点: 1. 提供几乎零延迟的使用体验,让Ipad变成 *** 正专业绘图工具。 2. 用户可在Mac和ipad上分别设置,可以将ipad上的绘图显示在Mac屏幕上。 3. 可允许用户添加多达7个自定义屏幕按键,可以更快捷地使用功能。 4. Liquid Extreme功能,可输出Retina分辨率,能够使iPad 上的画面和Mac基本无差。 5. 支持魔法手势,可使用手指和 Pencil一体来控制界面。例如,将手指功能设置为橡皮擦后,当手指放置在屏幕上时,手中的Apple Pencil就能秒变橡皮擦。评分:⭐️⭐️⭐️⭐️⭐️

ArtRage特色:如果你喜欢纯艺,那这个工具可以帮你画出跟现实中绘画效果一样的作品。它的所有设计都是围绕帮你画得跟线下效果一样自然逼 *** 。里面有很多小工具都是模仿现实感,还可以增加光泽度。 *** :2.99美元难度等级:5-8亮点: 1. 小巧自然的绘图软件,可以轻松画出具有艺术气息的作品。用户使用时,像“ *** 实世界的绘画工具”,例如水彩、油画等效果,帮助绘制逼 *** 作品。 2. 支持混合模式、添加图层和导入图像功能,更有序地绘 *** 品。 3. 笔触功能除了常规外,还有例如油刷、调色刀、 *** 筒刷、油漆管等更实用的工具,可以随意涂抹颜料和混合颜色,创建自然纹理。 4. 还有互补色,可以自动显示各种类型的补充来选择颜色,还可调整光泽度。 5. 可以记录所有绘画过程。 6. 与 *** 纯工具不同,它有一个艺术社区,可以分享自己的作品。评分:⭐️⭐️⭐️⭐️

Comic Draw特色:之前我帮客户画过条漫,作过欧美漫画的外包。这个应用可以方便套用格式做出漫画,用画面来讲故事。漫画相关的工具都可以很方便 *** 。 *** :免费 难度等级:5-7亮点: 1. 由 *** 的漫画家设计,专业的“如何做漫画”的工具。 2. 用图形讲故事的技巧,包括布局、故事版、上色等技巧。 3. 可以添加 *** 指南,拖动画面找到想要的角度。可以很容易画出楼房、风景、人物姿态的准确度和动态感。 4. 可以设置专业格式脚本,例如序言、对话、声音,可以更方便编辑内容。 5. 有一个充满活力的社区论坛,可以跟 *** 用户互动,学习技巧获得建议。评分:⭐️⭐️⭐️

国内版:米塔数字艺术特色:国内也有不少绘画平台,各有利弊。但做得 *** 较全面的,可以试试米塔数字艺术。这个平台还算 *** 较新,目前所有功能都是免费的,有一款绘画工具,可以自己画或者通过AI来获得灵感,画完后可以分享到社区, *** 作品赚点小钱钱。当然,我还是 *** 较喜欢它的自动录制功能的,可以播放所有绘画过程,直接分享到抖音 *** 里挺方便的。 *** :免费 难度等级:6-8亮点: 1. 有相对专业的绘画工具,使用感觉跟procreate有些像。 2. 跟procreate一样,在画画过程中,可以自动记录每一笔 *** 作,可以回放。 3. 自动保存,云端同步。如果画完忘记了保存,可以在 *** 稿箱里找到,不会丢失。 4. 可分享到社区里获得点赞关注,也可以将绘画过程分享到抖音、微信等 *** 自媒体。 5. 可以获得确权的保障,还可以自己标价 *** 作品。评分:⭐️⭐️⭐️⭐️

Space Draw特色:最后来介绍一款3D绘画软件,就是可以在3D的空间里随意绘画。当然这个需要VR设备,它是通过手柄来 *** 作的,就是一个模拟现实空间感的绘画,你在一个空间里左手是颜料盘右手是画笔,可以随意涂抹出立体感,只能说是一个 *** 较特别体验。 *** :免费 难度等级:7-9亮点: 1. VR作为未来交互方式,在视觉上有一种身临其境感。 2. *** 作还算便捷,但用户群体以青少年为主,所以不用教学就可以开始画画。 3. 有24种特效笔刷,可以在场景里放入雪花和星星火焰或者发光的树叶效果。 4. 画好后,可以拍照,从各个角度都可以拍,还可分享给别人。评分:⭐️⭐️⭐️

Android使用SVG矢量图打造酷炫动效!

一个 *** 正酷炫的动效往往让人虎躯一震,话不多说,咱们先瞅瞅效果:

-------------------------------

如果你想看 GAStudio Githu *** 主页,请戳这里; 如果你想看 GAStudio更多技术文章,请戳这里; *** 技术交流群:8;

--------------------------------

这个效果我们需要考虑以下几个问题:

1. 这是图片还是文字;

2. 如果是图片该如何拿到图形的边沿线坐标,如果是文字呢?

3. 如果拿到了边沿线坐标,如何让 *** 沿着路径跑动;

4. 怎么处理过程的衔接;

以上四个问题似乎不是太好处理,而这几个问题也正好是这个效果精华所在,接下来咱们一个一个进行考虑,当然这种考虑已经基于一些国外大神的基础之上;

首先这是图片还是文字?

答案是:背景是图片,表面的文字还是图片,有些同学可能会说了, *** ,这么没含量,一个帧动画而已,还虎躯一震,XXXXX,当然,答案肯定不会是这样的,背景我就不说了,普通的jpg或png图,但文字则是SVG格式的矢量图;

有了之一个问题的答案,我们来看第二个问题,如何拿到文字图形的边沿坐标;

要回答这个问题,我们先来简单的了解一个SVG(矢量图);

SVG 意为可缩放矢量图形(Scala *** le Vector Graphi *** ),是使用 XML 来描述二维图形和绘图程序的语言;

使用 SVG 的优势在于:

1.SVG 可被非常多的工具读取和修改( *** 如记事本),由于使用xml格式定义,所以可以直接被当作文本文件打开,看里面的数据;

2.SVG 与 JPEG 和 GIF 图像 *** 起来,尺寸更小,且可压缩性更强,SVG 图就相当于保存了关键的数据点, *** 如要显示一个圆,需要知道圆心和半径,那么SVG 就只保存圆心坐标和半径数据,而平常我们用的位图都是以像素点的形式根据图片大小保存对应个数的像素点,因而SVG尺寸更小;

3.SVG 是可伸缩的,平常使用的位图拉伸会发虚,压缩会变形,而SVG格式图片保存数据进行运算展示,不管多大多少,可以不失 *** 显示;

4.SVG 图像可在任何的分辨率下被高质量地打印;

5.SVG 可在图像质量不下降的情况下被放大;

6.SVG 图像中的文本是可选的,同时也是可搜索的(很适合 *** 地图);

7.SVG 可以与 J *** a 技术一起运行;

8.SVG 是开放的标准;

9.SVG 文件是纯粹的 XML;

看起来好厉害的样子,还是回到我们的问题,从SVG图中我们可否拿到我们想要的数据点呢?根据上面的介绍,答案当然是肯定的,从SVG图中我们可以拿到我们想要的所有数据;

好的,拿到数据之后,怎么让一条线沿着路径跑起来呢?毋庸置疑,我们需要用到path;

最后我们根据效果的需要,设置几个绘制过程,进行绘制;

接下来我们一起来解决以上问题:

既然SVG是公认的xml文件格式定义的,那么我们则可以通过解析xml文件拿到对应SVG图的所有数据,我们先看下 path 类型的SVG 数据:

*** lt;?xml version= *** #34;1.0 *** #34; standalone= *** #34;no *** #34;? *** gt; *** lt;!DOCTYPE svg PU *** LIC *** #34;-//W3C//DTD SVG 1.1//EN *** #34; *** #34;#34; *** gt; *** lt;svg width= *** #34;100% *** #34; height= *** #34;100% *** #34; version= *** #34;1.1 *** #34; xmlns= *** #34;#34; *** gt; *** lt;path d= *** #34;M *** 150 L150 350 L350 350 Z *** #34; / *** gt; *** lt;/svg *** gt;

上面有一个path 标签,里面用到了 M 和 Z 指令,M 就相当于 android Path 里的moveTo(),Z 则相当于 Path 里的close();

我们先看下SVG 里关于path 有哪些指令:

M = moveto 相当于 android Path 里的moveTo(),用于移动起始点 L = lineto 相当于 android Path 里的lineTo(),用于画线 H = horizontal lineto 用于画水平线 V = vertical lineto 用于画竖直线 C = c *** veto 相当于cu *** icTo(),三次贝塞尔曲线 S = *** ooth c *** veto 同样三次贝塞尔曲线,更平滑 Q = quadratic *** elzier c *** ve quadTo(),二次贝塞尔曲线 T = *** ooth quadratic *** elzier c *** veto 同样二次贝塞尔曲线,更平滑 A = elliptical Arc 相当于arcTo(),用于画弧 Z = closepath 相当于closeTo(),关闭path 了解了以上path相关的指令,就可以看懂path构成的SVG图的数据了,除此之外,SVG里还定义了一些基本的图形和效果: 更多介绍和使用大家可以看 W3School 好,以上内容,我们已经知道 SVG 图是通过 Xml 格式定义的,并且里面用到了一些基本的指令对数据进行组装,构成基本图形或复杂的路径; 而对于我们来说 ,这个xml 如何拿到呢? 1.我们根据最后要做的效果,利用PS等作图软件设计 *** 出想要的图形; 2. 使用 GIMP 之类的矢量图软件导出图片的SVG数据, *** 如下: 先使用魔棒工具快速建立选区: *** 将选区导出为path: 这个时候在软件的右边栏就可以看见生成的路径了, *** 将路径导出: 经过以上几步,我们就拿到了我们自己设计的文字或图形SVG图的Path数据,上面图片的SVG *** 如下: *** lt;?xml version= *** #34;1.0 *** #34; encoding= *** #34;UTF-8 *** #34; standalone= *** #34;no *** #34;? *** gt; *** lt;!DOCTYPE svg PU *** LIC *** #34;-//W3C//DTD SVG //EN *** #34; *** #34;#34; *** gt; *** lt;svg xmlns= *** #34;#34; width= *** #34;6.6in *** #34; height= *** #34;1.9in *** #34; view *** ox= *** #34;0 0 668 175 *** #34; *** gt; *** lt;path id= *** #34;Selection *** #34; fill= *** #34;none *** #34; stroke= *** #34; *** lack *** #34; stroke-width= *** #34;1 *** #34; d= *** #34;M 530.00,34.00 C 530.00,34.00 526.08,59.00 526.08,59.00 526.08,59.00 518.00,105.00 518.00,105.00 518.00,105.00 515.42,119.00 515.42,119.00 515.42,119.00 513.26,125.01 513.26,125.01 513.26,125.01 506.00,126.00 506.00,126.00 506.00,126.00 496.00,126.00 496.00,126.00 496.00,126.00 496.00,120.00 496.00,120.00 490.87,124.16 486.71,126.42 480.00,126.91 475.71,127.22 471.06,126.94 467.00,125.44 454.13,120.68 451.86,110.19 452.00,98.00 452.22,79.34 465.14,64.55 484.00,63.18 492.14,62.59 498.96,65.71 504.00,72.00 504.00,72.00 510.00,34.00 510.00,34.00 510.00,34.00 530.00,34.00 530.00,34.00 Z M 551.00,56.89 C 539.01,55.86 537.45,39.82 551.00,35.55 568.60,33.45 567.67,58.33 551.00,56.89 Z 中间段省略 M 263.00,134.00 C 263.00,134.00 263.00,145.00 263.00,145.00 263.00,145.00 202.00,145.00 202.00,145.00 202.00,145.00 202.00,134.00 202.00,134.00 202.00,134.00 263.00,134.00 263.00,134.00 Z *** #34; / *** gt; *** lt;/svg *** gt; 根据图形路径的复杂度,生成的path数据复杂度也不一样,但格式也算是非常的清楚,即采用一定的指令把数据点进行拼接; 现在有了这些数据点,我们需要做的则是对数据进行解析,封装成我们要的Path; 解析的过程也无非是 遇到指令则采用android Path 里的对应 *** 进行置换,解析方式如下: pu *** lic Path parsePath(String s) throws ParseException { mC *** rentPoint.set(Float.NaN, Float.NaN); mPathString = s; mIndex = 0; mLength = mPathString.length(); PointF tempPoint1 = new PointF(); PointF tempPoint2 = new PointF(); PointF tempPoint3 = new PointF(); Path p = new Path(); p.setFillType(Path.FillType.WINDING); *** oolean firstMove = true; while (mIndex *** lt; mLength) { char command = consumeCommand(); *** oolean relative = (mC *** rentToken == TOKEN_RELATIVE_COMMAND); switch (command) { case *** #39;M *** #39;: case *** #39;m *** #39;: { // m指令,相当于android 里的 moveTo() *** oolean firstPoint = true; while (advanceToNextToken() == TOKEN_VALUE) { consumeAndTran *** ormPoint(tempPoint1, relative *** amp; *** amp; mC *** rentPoint.x != Float.NaN); if (firstPoint) { p.moveTo(tempPoint1.x, tempPoint1.y); firstPoint = false; if (firstMove) { mC *** rentPoint.set(tempPoint1); firstMove = false; } } else { p.lineTo(tempPoint1.x, tempPoint1.y); } } mC *** rentPoint.set(tempPoint1); *** reak; } case *** #39;C *** #39;: case *** #39;c *** #39;: { // c指令,相当于android 里的 cu *** icTo() if (mC *** rentPoint.x == Float.NaN) { throw new ParseException( *** #34;Relative commands require c *** rent point *** #34;, mIndex); } while (advanceToNextToken() == TOKEN_VALUE) { consumeAndTran *** ormPoint(tempPoint1, relative); consumeAndTran *** ormPoint(tempPoint2, relative); consumeAndTran *** ormPoint(tempPoint3, relative); p.cu *** icTo(tempPoint1.x, tempPoint1.y, tempPoint2.x, tempPoint2.y, tempPoint3.x, tempPoint3.y); } mC *** rentPoint.set(tempPoint3); *** reak; } case *** #39;L *** #39;: case *** #39;l *** #39;: { // 相当于lineTo()进行画直线 if (mC *** rentPoint.x == Float.NaN) { throw new ParseException( *** #34;Relative commands require c *** rent point *** #34;, mIndex); } while (advanceToNextToken() == TOKEN_VALUE) { consumeAndTran *** ormPoint(tempPoint1, relative); p.lineTo(tempPoint1.x, tempPoint1.y); } mC *** rentPoint.set(tempPoint1); *** reak; } case *** #39;H *** #39;: case *** #39;h *** #39;: { // 画水平直线 if (mC *** rentPoint.x == Float.NaN) { throw new ParseException( *** #34;Relative commands require c *** rent point *** #34;, mIndex); } while (advanceToNextToken() == TOKEN_VALUE) { float x = tran *** ormX(consumeValue()); if (relative) { x += mC *** rentPoint.x; } p.lineTo(x, mC *** rentPoint.y); } mC *** rentPoint.set(tempPoint1); *** reak; } case *** #39;V *** #39;: case *** #39;v *** #39;: { // 画竖直直线 if (mC *** rentPoint.x == Float.NaN) { throw new ParseException( *** #34;Relative commands require c *** rent point *** #34;, mIndex); } while (advanceToNextToken() == TOKEN_VALUE) { float y = tran *** ormY(consumeValue()); if (relative) { y += mC *** rentPoint.y; } p.lineTo(mC *** rentPoint.x, y); } mC *** rentPoint.set(tempPoint1); *** reak; } case *** #39;Z *** #39;: case *** #39;z *** #39;: { // 封闭path p.close(); *** reak; } } } ret *** n p; } 有了图形对应的path,我们只需要按照我们想要的效果进行绘制即可,具体过程不再细讲,大家看代码: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mState == STATE_NOT_STARTED || mGlyphData == null) { ret *** n; } long t = *** .c *** rentTimeMillis() - mStartTime; // 绘制出现前的边沿线和跑动过程 for (int i = 0; i *** lt; mGlyphData.length; i++) { float phase = MathUtil.constrain(0, 1, (t - (mTraceTime - mTraceTimePerGlyph) * i * 1f / mGlyphData.length) * 1f / mTraceTimePerGlyph); float distance = INTERPOLATOR.getInterpolation(phase) * mGlyphData[i].length; mGlyphData[i].paint.setColor(mTraceResidueColors[i]); mGlyphData[i].paint.setPathEffect(new DashPathEffect( new float[] { distance, mGlyphData[i].length }, 0)); canvas.drawPath(mGlyphData[i].path, mGlyphData[i].paint); mGlyphData[i].paint.setColor(mTraceColors[i]); mGlyphData[i].paint.setPathEffect(new DashPathEffect( new float[] { 0, distance, phase *** gt; 0 ? mMarkerLength : 0, mGlyphData[i].length }, 0)); canvas.drawPath(mGlyphData[i].path, mGlyphData[i].paint); } if (t *** gt; mFillStart) { if (mState *** lt; STATE_FILL_STARTED) { changeState(STATE_FILL_STARTED); } // 绘制渐变出现的过程,即改变alpha过程 float phase = MathUtil.constrain(0, 1, (t - mFillStart) * 1f / mFillTime); for (int i = 0; i *** lt; mGlyphData.length; i++) { GlyphData glyphData = mGlyphData[i]; mFillPaint.setARG *** ((int) (phase * ((float) mFillAlphas[i] / (float) 255) * 255), mFillReds[i], mFillGreens[i], mFill *** lues[i]); canvas.drawPath(glyphData.path, mFillPaint); } } if (t *** lt; mFillStart + mFillTime) { ViewCompat.postInvalidateOnAnimation(this); } else { changeState(STATE_FIN *** HED); } } 好了,主要的问题和思路基本如上,有些人可能会说,你这讲的跟UX分享似的,没毛线用,其实我的目的只有一个,那就是不管你是否能看懂代码,都能按照我上面所说做出自己想要的效果,并加以改变,灵活运用,毕竟轮子不需要重复造! 我本 *** 是对SVG矢量图刚有所了解,主要参考国外大神的一篇博客,链接如下: *** DN源码下载 *** : ------------------------------

如果你想看 GAStudio Githu *** 主页,请戳这里; 如果你想看 GAStudio更多技术文章,请戳这里; *** 技术交流群:8;

--------------------------------