SVG ----scalable vector Graphics
可缩放矢量图形
android L 即android 5.0的新特性。
1,SVG是干什么的?
可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式。它由万维网联盟制定,是一个开放标准。
2,SVG特点?
- SVG 可被非常多的工具读取和修改(比如记事本)
- SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。
- SVG 是可伸缩的
- SVG 图像可在任何的分辨率下被高质量地打印
- SVG 可在图像质量不下降的情况下被放大
- SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)
- SVG 可以与 Java 技术一起运行
- SVG 是开放的标准
- SVG 文件是纯粹的 XML
官网的例子:
<!-- res/drawable/heart.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" <!-- intrinsic size of the drawable --> android:height="256dp" android:width="256dp" <!-- size of the virtual canvas --> android:viewportWidth="32" android:viewportHeight="32"> <!-- draw a path --> <path android:fillColor="#8fff" android:pathData="M20.5,9.5 c-1.955,0,-3.83,1.268,-4.5,3 c-0.67,-1.732,-2.547,-3,-4.5,-3 C8.957,9.5,7,11.432,7,14 c0,3.53,3.793,6.257,9,11.5 c5.207,-5.242,9,-7.97,9,-11.5 C25,11.432,23.043,9.5,20.5,9.5z" /> </vector>
这样就定义好了一个静态的矢量图,可以像一般的图片资源使用,设置到imageView中会显示出一个心形。控制显示心形的就是上面path
这个标签,一个path
代表一个元素,绘制的内容是pathData
下的一长串字符,里面是SVG绘制的一系列命令,提供moveTo、lineTo、close等操作,可以和Graphics 中的Path操作对应起来。
在android中使用矢量图有一下步骤:
1,在drawable资源下面创建矢量图的.xml文件
vector.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="256dp" android:width="256dp" android:viewportHeight="32" android:viewportWidth="32" > <path android:fillColor="#0000FF" android:pathData=" M20.5,9.5 c-1.955,0,-3.83,1.268,-4.5,3 c-0.67,-1.732,-2.547,-3,-4.5,-3 C8.957,9.5,7,11.432,7,14 c0,3.53,3.793,6.257,9,11.5 C25,11.432,23.043,9.5,20.5,9.5z " /> </group> </vector>
其中
M 100 100 L 300,200 L 200,300 Z
- M: move to 移动绘制点 ,就是从坐标100,100向300,200坐标移动,画条直线,300,200-->200,300画条直线。
- L:line to 直线
- Z:close 闭合--也就是svg的结束位置
- C:cubic bezier 三次贝塞尔曲线
- Q:quatratic bezier 二次贝塞尔曲线
- A:ellipse 圆弧
- H:horizontal line to 水平直线
在布局文件中使用:
<ImageVIew android:id="@+id/imageVIew1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentTop="true" android:layout_centerhorizontal = "true" android:src = "@drawable/vector" />
效果图:
然后分享两个svg值获取的方法:
http://svg-edit.googlecode.com/svn/branches/2.4/editor/svg-editor.html
一个是个离线的工具:
inkscape
界面:
然后将svg保存到桌面上,并用浏览器打开:
查看svg信息:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="744.09448819" height="1052.3622047" id="svg2" version="1.1" inkscape:version="0.48.4 r9939" sodipodi:docname="新建文档 1"> <defs id="defs4" /> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.35" inkscape:cx="375" inkscape:cy="405.71429" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1280" inkscape:window-height="738" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" /> <metadata id="metadata7"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> <path sodipodi:type="arc" style="fill:#ff0000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path2985" sodipodi:cx="402.85715" sodipodi:cy="385.21933" sodipodi:rx="217.14285" sodipodi:ry="230" d="m 620,385.21933 a 217.14285,230 0 1 1 -434.28571,0 217.14285,230 0 1 1 434.28571,0 z" /> <path sodipodi:type="star" style="fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path2987" sodipodi:sides="5" sodipodi:cx="205.71429" sodipodi:cy="349.50504" sodipodi:r1="149.99319" sodipodi:r2="74.996597" sodipodi:arg1="1.2610934" sodipodi:arg2="1.8894119" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="m 251.42858,492.36218 -69.20713,-71.63513 -98.24588,16.40014 46.74287,-87.95636 -45.957098,-88.36947 98.095808,17.27511 69.84283,-71.01547 13.88368,98.63296 89.12234,44.47949 -89.51523,43.68342 z" inkscape:transform-center-x="-14.126491" inkscape:transform-center-y="0.20655178" transform="translate(214.28571,37.142857)" /> </g> </svg>
红色部分就是svg值,因此如果你在android svg开发中如果为svg值头疼可以参考这个工具来写。
关于兼容性:
众所周知svg概念在android上是出现在android 5.0以后的,所以也出现了相关的兼容性的问题:
1 ,首先style的兼容性:
res/values/styles.xml android低版本默认读取
res/values_v21/styles.xml 这个尽可能使用android5.0风格的特性
2 ,layout布局文件,重点是一些控件的支持:
res/layout/activity.xml 所有通用的布局在这里写。
res/layout_v21/activity.xml 使用android 5.0新特性的一些控件的布局。
3 ,support library 比如recycleview cardview等的向下兼容:
4,就是通过检测系统的版本来调用不同系统版本的api
if(Build.VERSION.SDK-INT>=build.VERSION_CODES.LOLIPOP){
//使用材料设计的5.0新特性
}else{
//使用低于5.0的通用各版本方法
}