导语
黑科技来了,Google在Android5.X中增加了对SVG矢量图形的支持,这对于创造新的高效率动画具有很深远的意义。
主要内容
- < path >标签
- SVG常见指令
- SVG编辑器
- Android中使用SVG
- SVG动画实例
具体内容
首先,我们来了解一下什么是SVG:
- 可伸缩矢量图形
- 定义用于网络的基于矢量的图形
- 使用xml格式定义图形
- 图片在放大或者改变尺寸的情况下其图形质量不会有所损失
- 万维网联盟的标准
- 与诸多DOM和XSL之类的W3C标准是一个整体
SVG在web上应用非常广泛,在Android5.X之前的Android版本上,大家可以通过一些第三方库在Android中使用SVG,而在Android5.X后,Android中添加了对< path >标签的支持,从而让开发者可以使用SVG来创建更加丰富的动画效果,那么SVG对传统的Bitmap,究竟有什么好处呢?bitmap通过每个像素点上存储色彩信息来表达图像,而SVG是一个绘图标准,与之相对,最大的优势是SVG放大不会失真,而且bitmap需要不同分辨率适配,SVG不需要。
< path >标签
使用< path >标签来创建SVG,就是用指令的方式来控制一支画笔,列入,移动画笔来到某一个坐标位置,画一条线,画一条曲线,结束,< path >标签所支持的指令大致有一下几种:
- M = moveto(M X,Y):将画笔移动到指定的坐标位置,但未发生绘制。
- L = lineto(L X,Y):画直线到指定的位置。
- H = horizontal lineto( H X):画水平线到指定的X坐标位置。
- V = vertical lineto(V Y ):画垂直线到指定的Y坐标。
- C = curveto(C ,X1,Y1,X2,Y2,ENDX,ENDY):三次贝塞尔曲线。
- S = smooth curveto(S X2,Y2,ENDX,ENDY):三次贝塞尔曲线。
- Q = quadratic Belzier curve(Q X Y,ENDX,ENDY):二次贝塞尔曲线。
- T = smooth quadratic Belzier curvrto(T,ENDX,ENDY):映射前面路径的重点。
- A = elliptical Are(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧线。
- Z = closepath():关闭路径。
使用上面的指令时,需要注意的几点:
- 坐标轴以(0,0)位中心,X轴水平向右,Y轴水平向下。
- 所有指令大小写均可,大写绝对定位,参照全局坐标系,小写相对定位,参照父容器坐标系。
- 指令和数据间的空格可以无视。
- 同一指令出现多次可以用一个。
SVG常见指令
- L
绘制直线的指令是“L”,代表从当前点绘制直线到给定点,“L”之后的参数是一个点坐标,如“L 200 400”绘制直线,同时,还可以使用“H”和“V”指令来绘制水平竖直线,后面的参数是x坐标个y坐标。
- M
M指令类似Android绘图中的path类moveto方法,即代表画笔移动到某一点,但并不发生绘图动作。
- A
A指令是用来绘制一条弧线,且允许弧线不闭合,可以把A指令绘制的弧度想象成椭圆的某一段A指令一下有七个指令。
- RX,RY指所有的椭圆的半轴大小。
- XROTATION 指椭圆的X轴和水平方向顺时针方向的夹角,可以想象成。一个水平的椭圆饶中心点顺时针旋转XROTATION 的角度。
- FLAG1 只有两个值,1表示大角度弧度,0为小角度弧度。
- FLAG2 只有两个值,确定从起点到终点的方向1顺时针,0逆时针。
- X,Y为终点坐标。
SVG的指令参数非常的复杂,但是再Android中,不需要绘制太多的SVG图像,后面会有几个小案例。
SVG编辑器
SVG参数的写法固定而且复杂,因此完全可以使用程序来实现,所以一般通过SVG编辑器来编辑SVG图像,网上有很多在线的编辑器,通过可视化编辑图像之后,点击view→source可以转换成SVG代码。
下载离线的SVG编辑器,由很多强大的功能,这里就不一一赘述了。
Android中使用SVG
Google在Android5.X后给我们提供了两个新的API来支持SVG:
- VectorDrawable
- AnimatedVectorDrawable
其中,VectorDrawable可以让你创建基于XML的SVG图像,并且结合AnimatedVectorDrawable来实现动画效果。
VectorDrawable
在XML中创建一个静态的SVG,通常是如下结构。
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportHeight="100"
android:viewportWidth="100">
</vector>
这个代码之中包含了两组高宽,width和height是表示SVG图像的具体大小,后面的是表示SVG图像划分的比例,后面再绘制path时所使用的参数,就是根据这两个值来进行转换的,比如上面的代码,将200dp划分100份,如果在绘图中使用坐标(50,50),则意味着该坐标为正中间,现在我们加上path标签。
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportHeight="100"
android:viewportWidth="100">
<group
android:name="svg1"
android:rotation="0">
<path
android:fillColor="@android:color/holo_blue_light"
android:pathData="M 25 50 a 25,25 0 1,0 50,0" />
</group>
</vector>
通过添加< path>标签绘制一个SVG图形,pathData就是图形所用到的指令了,先用M指令,将画笔移动到(25 , 50)的位置,再通过A指令来绘制一个圆弧并且填充他,通过以上代码,就可以绘制一个SVG图形了。
上面使用android:fillColor属性来绘制填充图形,如果要绘制非填充的图形可以使用以下属性。
android:strokeColor="@android:color/holo_blue_light"
android:strokeWidth="2"
AnimatedVectorDrawable
AnimatedVectorDrawable的作用是给VectorDrawable提供动画效果,Google的工程师将AnimatedVectorDrawable比喻一个胶水,通过AnimatedVectorDrawable来连接静态的VectorDrawable和动态的objectAnimator。
下面我们来看看具体是怎么样来做的,首先我们在xml中定义一个< animated-vector>,来申明对AnimatedVectorDrawable的使用,并且指明是作用在path或者group上。
- anim_vector.xml
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/verctor">
<target