SVG

来源:互联网 发布:旅游公共服务网络文献 编辑:程序博客网 时间:2024/06/03 09:29

Android微信上的SVG

SVG

即Scalable Vector Graphics 可伸缩矢量图形,这种图像格式在前端中已经使用的非常广泛了。

SVG的W3C的解释: http://www.w3school.com.cn/svg/svg_intro.asp

矢量图像

SVG是W3C 推出的一种开放标准的文本式矢量图形描述语言,他是基于XML的、专门为网络而设计的图像格式,

SVG是一种采用XML来描述二维图形的语言,所以它可以直接打开xml文件来修改和编辑。

位图图像

位图图像的存储单位是图像上每一点的像素值,因而文件会比较大,像GIF、JPEG、PNG等都是位图图像格式。

Vector

在Android中指的是Vector Drawable,也就是Android中的矢量图,可以说Vector就是Android中的SVG实现(并不是支持全部的SVG语法,现已支持的完全足够用了)

补充:Vector图像刚发布的时候,是只支持Android 5.0+的,自从AppCompat 23.2之后,Vector可以使用于Android 2.1以上的所有系统,
只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。(所谓的兼容,即低版本非真实使用SVG,而是生成PNG图片)

Vector Drawable:

Android 5.0发布的时候,Google提供了Vector的支持,即:Vector Drawable类。

Vector Drawable相对于普通的Drawable来说,有以下几个好处:

(1)Vector图像可以自动进行适配,不需要通过分辨率来设置不同的图片。

(2)Vector图像可以大幅减少图像的体积,同样一张图,用Vector来实现,可能只有PNG的几十分之一。

(3)使用简单,很多设计工具,都可以直接导出SVG图像,从而转换成Vector图像 功能强大。

(4)不用写很多代码就可以实现非常复杂的动画 成熟、稳定,前端已经非常广泛的进行使用了。

Vector 语法简介

通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。

Path指令解析如下所示:指令详情
M = moveto(M X,Y) :将画笔移动到指定的坐标位置,相当于 android Path 里的moveTo()
L = lineto(L X,Y) :画直线到指定的坐标位置,相当于 android Path 里的lineTo()
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 curveto(T ENDX,ENDY):映射 同样二次贝塞尔曲线,更平滑
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧线 ,相当于arcTo()
Z = closepath():关闭路径(会自动绘制链接起点和终点)

注意,M处理时,只是移动了画笔, 没有画任何东西。

  1. 关于这些语法,开发者不需要全部精通,而是能够看懂即可,这些path标签及数据生成都可以交给工具来实现。(一般美工来帮你搞定!PS、Illustrator等等都支持导出SVG图片)

  2. 程序员:没必要去学习使用这些设计工具,开发者可以利用一些工具,自己转换一些比较基础的图像,如:http://inloop.github.io/svg2android/

  3. 还可以使用SVG的编辑器来进行SVG图像的编写,例如:http://editor.method.ac/
    (可以先用http://editor.method.ac/ 生成SVG图片,然后用http://inloop.github.io/svg2android/ 生成 VectorDrawable xml代码)

  4. 使用AndroidStudio插件完成SVG添加(Vector Asset Studio)
    详细:http://www.jianshu.com/p/d6c39f2dd5e7
    AS会自动生成兼容性图片(高版本会生成xxx.xml的SVG图片;低版本会自动生成xxx.png图片)

  5. 有些网站可以找到SVG资源
    SVG下载地址:
    http://www.shejidaren.com/8000-flat-icons.html
    http://www.flaticon.com/ http://www.iconfont.cn/plus — 阿里巴巴
    图片转成SVG: https://vectormagic.com/

Vector Drawable: 兼容问题,5.0以上的可以直接用:

兼容5.0以下的版本

  • 使用Android Studio 2.2以上的版本,gradle版本在2.0以上,准备步骤

    • 添加
      defaultConfig {
      vectorDrawables.useSupportLibrary = true
      }

    • 添加

    • Activity需要继承与AppCompatActivity

    • 布局文件当中添加
      xmlns:app=”http://schemas.android.com/apk/res-auto”

  • 使用在Actvity前面添加一个flag设置
    static{AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);}

    • ImageView/ImageButton
      XML app:srcCompat
      代码里面使用无区别

    • Button 不支持app:srcCompat
      Xml 使用在Button的selector

    • RadioButton 直接使用

    • textview的drawable 直接使用

    • 使用的动态Vector Drawable
      主要是不能直接修改 pathData
      不能使用自定义interpolator

Vector 属性示例

在 drawable 目录中创建一个 triangle.xml 文件,内容如下:

<?xml version="1.0" encoding="utf-8"?><vector xmlns:android="http://schemas.android.com/apk/res/android"    android:width="400dp"    android:height="400dp"    android:viewportHeight="400"    android:viewportWidth="400">    <path        android:pathData="M 100 100 L 300 100 L 200 300 z"        android:strokeColor="#000000"        android:strokeWidth="5"        android:fillColor="#FF0000"        /></vector>

path 元素里面的 pathData 就是矢量图的路径数据,除此之外还可以设置其他属性。 path 元素一共包含如下属性:

android:name 定义该 path 的名字,这样在其他地方可以通过名字来引用这个路径
android:pathData 和 SVG 中 d 元素一样的路径信息。
android:fillColor 定义填充路径的颜色,如果没有定义则不填充路径
android:strokeColor 定义如何绘制路径边框,如果没有定义则不显示边框
android:strokeWidth 定义路径边框的粗细尺寸
android:strokeAlpha 定义路径边框的透明度
android:fillAlpha 定义填充路径颜色的透明度
android:trimPathStart 从路径起始位置截断路径的比率,取值范围从 0 到1
android:trimPathEnd 从路径结束位置截断路径的比率,取值范围从 0 到1
android:trimPathOffset 设置路径截取的范围 Shift trim region (allows showed region to include the start and end), in the range from 0 to 1.
android:strokeLineCap 设置路径线帽的形状,取值为 butt, round, square.
android:strokeLineJoin 设置路径交界处的连接方式,取值为 miter,round,bevel.
android:strokeMiterLimit 设置斜角的上限,Sets the Miter limit for a stroked path. 注:当strokeLineJoin设置为 “miter” 的时候, 绘制两条线段以锐角相交的时候,所得的斜面可能相当长。当斜面太长,就会变得不协调。strokeMiterLimit 属性为斜面的长度设置一个上限。这个属性表示斜面长度和线条长度的比值。默认是 10,意味着一个斜面的长度不应该超过线条宽度的 10 倍。如果斜面达到这个长度,它就变成斜角了。当 strokeLineJoin 为 “round” 或 “bevel” 的时候,这个属性无效。

根元素 vector 是用来定义这个矢量图的,该元素包含如下属性:

android:name 定义该drawable的名字
android:width 定义该 drawable 的内部(intrinsic)宽度,支持所有 Android 系统支持的尺寸,通常使用 dp
android:height 定义该 drawable 的内部(intrinsic)高度,支持所有 Android 系统支持的尺寸,通常使用 dp
android:viewportWidth 定义矢量图视图的宽度,视图就是矢量图 path 路径数据所绘制的虚拟画布
android:viewportHeight 定义矢量图视图的高度,视图就是矢量图 path 路径数据所绘制的虚拟画布
android:tint 定义该 drawable 的 tint 颜色。默认是没有 tint 颜色的
android:tintMode 定义 tint 颜色的 Porter-Duff blending 模式,默认值为 src_in
android:autoMirrored 设置当系统为 RTL (right-to-left) 布局的时候,是否自动镜像该图片。比如 阿拉伯语。
android:alpha 该图片的透明度属性

有时候我们需要对几个路径一起处理,这样就可以使用 group 元素来把多个 path 放到一起。 group 支持的属性如下:

android:name 定义 group 的名字
android:rotation 定义该 group 的路径旋转多少度
android:pivotX 定义缩放和旋转该 group 时候的 X 参考点。该值相对于 vector 的 viewport 值来指定的。
android:pivotY 定义缩放和旋转该 group 时候的 Y 参考点。该值相对于 vector 的 viewport 值来指定的。
android:scaleX 定义 X 轴的缩放倍数
android:scaleY 定义 Y 轴的缩放倍数
android:translateX 定义移动 X 轴的位移。相对于 vector 的 viewport 值来指定的。
android:translateY 定义移动 Y 轴的位移。相对于 vector 的 viewport 值来指定的。

通过上面的属性可以看出, group 主要是用来设置路径做动画的关键属性的。

最后, vector 还支持 clip-path 元素。定义当前绘制的剪切路径。注意,clip-path 只对当前的 group 和子 group 有效。

android:name 定义 clip path 的名字
android:pathData 和 android:pathData 的取值一样。

从上面 vector 支持的属性可以看出,功能还是比较丰富的。
例如 前面提到的三角形,通过 group 可以把其旋转 90度。

<?xml version="1.0" encoding="utf-8"?><vector xmlns:android="http://schemas.android.com/apk/res/android"    android:width="400dp"    android:height="400dp"    android:viewportHeight="400"    android:viewportWidth="400">    <group        android:name="name"        android:pivotX="200"        android:pivotY="200"        android:rotation="90">        <path            android:fillColor="#FF0000"            android:pathData="M 100 100 L 300 100 L 200 300 z"            android:strokeColor="#000000"            android:strokeWidth="5" />    </group></vector>

SVG图片动画效果示例:

实现效果:点击对号后,对号的alpha值从0到1进行变化的动画效果
这里写图片描述
1.首先创建一个vector图片
ic_check.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"    android:width="24dp"    android:height="24dp"    android:viewportWidth="24.0"    android:viewportHeight="24.0">    <group        android:scaleX="0.5"        android:scaleY="1.5"        >    <path        android:name="path_check"//这里的name后面会用到        android:fillColor="#FF000000"        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>    </group></vector>

2.res/animator下新建一个check_animator.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:duration="500"        android:propertyName="fillAlpha"//alpha01        android:valueFrom="0"        android:valueTo="1"        android:valueType="floatType"        ></objectAnimator></set>

3.然后创建一个animated-vector
check_ani.xml

<?xml version="1.0" encoding="utf-8"?><animated-vector xmlns:android="http://schemas.android.com/apk/res/android"    android:drawable="@drawable/ic_check">    <target        android:animation="@animator/check_animator"        android:name="path_check">//name用的是ic_check的name    </target></animated-vector>

4.MainActivity的xml中添加:

    <ImageView        android:layout_marginTop="20dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="anim"        app:srcCompat="@drawable/check_ani"/>

Activity:

    public void anim(View view){        ImageView imageView = (ImageView) view;        Drawable drawable = imageView.getDrawable();        ((Animatable) drawable).start();    }
原创粉丝点击