前言
前几天,老伙计推送微信的一篇文章,文章标题为:【Android微信上的SVG】,正好LZ借此机会学习了解下有关SVG的相关内容。
微信文章阅读后感
首先,微信提出了几个论点:
而微信上的SVG亟需解决的俩个问题如下:
让我们一起来见证下,经过微信团队的优化后,真实有效的数据吧!
两张xxhdpi资源在OPPO R7Plus上的显示结果。左边SVG,右边PNG。
SVG在加载的过程中得到非常大优势,而Draw的时候因为没有硬件渲染导致性能远不如PNG。但通过在加载阶段的大幅提升,让SVG在整体耗时上赢了PNG。
而关于以上,微信提出了如下:
❈
事实上,SVG渲染过程使用了Picture进行绘制。Picture并不支持硬件加速,因此必须要将View的LayerType设为Software,而这个操作的意义就是为View创建了一个Bitmap将Picture绘制其上,同时缓存起来。所以,我们可以将“加载”和“渲染”放在一起进行比较,就是因为只有第一次的加载和渲染上我们同PNG是不同的。在这之后,一旦创建好了SoftwareLayer用的Bitmap,绘制过程就同PNG图片一样,可以用硬件渲染来画Bitmap了。
所以,我们得到了比PNG快上70%的SVG矢量化资源
而相对应的优点背后,也存在着不可避免的牺牲:
由于我们实现方式的原因,启动进程时每个SVG将额外消耗掉280us左右的时间。大概就是当我们替换完1000个资源后,我们的启动时间可能会增加280ms。
这样做是有原因的,一方面是因为我们必须这么做来实现框架的无感知,另外也是为了使SVG的整体效率更高(因为生成了一些代码使得后面通过ResourceID免除了反射查找一些类的时间)。而事实上即便我们把这个时间加回到每次加载平均值中,SVG也依旧领先于PNG的整体耗时。
❈
好了,有关微信官方讲述的内容介(kao)绍(bei)到此结束,下面,我们将从概念、过程以及使用的方面去讲解说明有关SVG的基本操作流。
Hi,SVG
可能上面微信介绍大家有点懵,没关系,LZ也是一样懵,我们只需要了解如下几点即可:
而关于SVG,它究竟是什么?到现在我们了解甚少,不过,没关系,慢慢来呗~
SVG,即Scalable Vector Graphics 可伸缩矢量图形。而关于详细,请查阅:W3School官方
首先要解释下矢量图像以及位图图像?
而这里需要注明的一点:
❈
Vector图像刚发布的时候,是只支持Android 5.0+的,自从AppCompat 23.2之后,Vector可以使用于Android 2.1以上的所有系统,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。(所谓的兼容也就是表里不一,即低版本非真实使用SVG,而是生成PNG图片)
❈
还要说明的是,Android 5.0发布的时候,Google提供了Vector的支持,即:Vector Drawable类
Vector Drawable,Hello
Vector Drawable相对于普通的Drawable来说,有以下几个好处:
(1)Vector图像可以自动进行适配,不需要通过分辨率来设置不同的图片;
(2)Vector图像可以大幅减少图像的体积,同样一张图,用Vector来实现,可能只有PNG的几十分之一;
(3)使用简单,很多设计工具,都可以直接导出SVG图像,从而转换成Vector图像 功能强大;
(4)不用写很多代码就可以实现非常复杂的动画 成熟、稳定,前端已经非常广泛的进行使用了。
Vector 语法简介
主要通过使用Path标签,我们几乎可以完成所有操作。
而关于Path指令,具体解析如下所示:
注意,’M’ 处理时,只是移动了画笔, 没有画任何东西。
而关于以上的语法,我们只需要了解即可。
因为相对于编写过程中的消耗,我们都可以借助于一些工具来完成。
SVG初使用
关于编辑以及绘制SVG,我们可以通过如下网站搭配使用:
•SVG生成工具;
•SVG转为VectorDrawable
下面开始演示之路:
SVG生成:
接下来,SVG转为VectorDrawable:
之后,将下载完成后的xml拷贝到drawable目录下。
首先,我们简单的解析部分的语法,好让大家以后真正遇到后不会那么棘手。
android:pathData="
M 287 87.5
C 351.893458105 87.5 404.5 138.091823269 404.5 200.5
C 404.5 262.908176731 351.893458105 313.5 287 313.5
C 222.106541895 313.5 169.5 262.908176731 169.5 200.5
C 169.5 138.091823269 222.106541895 87.5 287 87.5
Z"
首先,将坐标移动到 287 87.5 位置,接着,分别绘制三次贝赛曲线,最后关闭路径。从而形成了一个图形。
首先,我们先当作一个图片直接使用:
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"
android:src="@drawable/method_draw_image" />
5.0+上显示效果如下:
不知道大家还记得,之前LZ说的,所谓的兼容,并不是真正的让低版本去使用SVG,而是在低版本上面讲SVG转为了png,不信你瞧:
有的小伙伴说,忒麻烦了,还有其他的方式么?简单点的?
Android Studio 创建 Vector Asset
右击res下的drawable目录,选择new,点击Vector Asset。
你可以调整透明度,也可以设置图片大小,如下:
当然,你也可以选择系统内容的图片,如下:
使用方式如上述一致,首先我们看一下生成的xml文件内容:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" // 宽度
android:height="24dp" // 高度
android:alpha="0.80" // 透明度
android:viewportHeight="24.0" // 高度平均分为24等份
android:viewportWidth="24.0"> // 宽度平均分为24等份
<path
android:fillColor="#FF000000"
android:pathData="M6,18c0,0.55 0.45,1 1,1h1v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L11,19h2v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L16,19h1c0.55,0 1,-0.45 1,-1L18,8L6,8v10zM3.5,8C2.67,8 2,8.67 2,9.5v7c0,0.83 0.67,1.5 1.5,1.5S5,17.33 5,16.5v-7C5,8.67 4.33,8 3.5,8zM20.5,8c-0.83,0 -1.5,0.67 -1.5,1.5v7c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-7c0,-0.83 -0.67,-1.5 -1.5,-1.5zM15.53,2.16l1.3,-1.3c0.2,-0.2 0.2,-0.51 0,-0.71 -0.2,-0.2 -0.51,-0.2 -0.71,0l-1.48,1.48C13.85,1.23 12.95,1 12,1c-0.96,0 -1.86,0.23 -2.66,0.63L7.85,0.15c-0.2,-0.2 -0.51,-0.2 -0.71,0 -0.2,0.2 -0.2,0.51 0,0.71l1.31,1.31C6.97,3.26 6,5.01 6,7h12c0,-1.99 -0.97,-3.75 -2.47,-4.84zM10,5L9,5L9,4h1v1zM15,5h-1L14,4h1v1z" />
</vector>
而运行的效果则是:
GitHub查看地址
https://github.com/HLQ-Struggle/SVGStudy
参考资料
1.微信官方SVG介绍;
2.W3School官方;