SVG动画

SVG简介
什么是SVG:
  • SVG矢量动画机制,Google在Android 5.x版本中增加了对SVG的支持

  • SVG特性:

    • 可伸缩矢量图形
    • 定义用于网络的矢量图形
    • 使用XML格式定义图形
    • 图像在放大或改变尺寸的情况下其图形质量不会有所损失
    • 符合万维网联盟标准
    • 与注入DOM和XSL之类的W3C标准是一个整体
  • Bitmap和SVG图像的区别:

    1. Bitmap是位图,由像素点组成,放大或者缩小就会失真,而SVG不会失真
    2. SVG使用XML格式定义图形,修改容易
    3. SVG由点来存储,由计算机根据点信息绘图,不会失真,无需根据分辨率及进行适配
    4. SVG的占用空间比Bitmap小
    5. SVG可以转化为Path路径,与Path动画相结合
具体使用:
  • 标准的SVG语法中支持很多标签,rect, circle, line, polyline,ellipse, polygon, path等标签
  • Android通过一种简化的方式对SVG进行兼容即Path标签
vector标签与图像显示
  • 将下面的代码放在drawable目录下,并使用控件展示:

<?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="50"
    android:viewportWidth="100">
    <path
        android:name="bar"
        android:pathData="M50, 23, L100,25"
        android:strokeWidth="2"
        android:strokeColor="@android:color/darker_gray"/>
</vector>
属性解释:
  • 首先我们使用width和height定义一个SVG画布,而viewportWidth和viewportHeight指的是将画布的宽和高分为多少个点,而path中的点的坐标都是以viewportWidth和viewportHeight的点数为坐标的,而不是dp值。
    • width和height属性:表示SVG图形的具体大小
    • viewportWidth与viewportHeight属性:表示SVG图形划分的比例
path标签和常用属性

path标签有如下几个常用属性:

android:name: 声明一个标记,类似于ID,便于对其作动画的时候找到该ID

android:pathData:对svg矢量图的描述

android:strokeWidth:画笔的宽度

android:fillColor:填充颜色

android:fillAlpha:填充颜色的透明度

android:strokeColor:描边颜色

android:strokeWidth:描边宽度

android:strokeAlpha:描边透明度

android:strokeLineJoin:用于指定折线拐角的形状,取值有miter(jiehechu为锐角)、round(结合处为 圆弧)、bevel(结合处为直线)

android:strokeLineCap:画出直线的终点的形状(线帽),  取值有butt(无线帽)、round(圆形线帽)、square(方形线帽)

android:strokeMiterLimit:设置斜角的上限,当strokeLineJoin的属性值为round和bevel的时候这个属性无效,当strokeLineJoin设置为miter的时候,锐角相交的时候斜面会变得相当长,苏哦一该属性的上限默认值为10

android:strokeLineJoin的效果对应于paint.setStrokeJoin(Paint.Join, join)函数, android:strokeLineCap对应于Paint.setStrokeCap(Paint.Cap, cap)函数
具体讲解某些函数
  • android:trimPathStart属性:
指定路径从哪里开始,取值0~1, 表示路径开始的位置的百分比,当取值为0表示从头开始,取值为1的时候表示不显示该路径
  • android:trimPathEnd属性:
指定路径的结束位置,取值为0~1, 表示路径结束位置的百分比,当取值为1时,路径正常结束,当取值为1时,路径正常结束,当取值为0时,路径不显示
  • android:trimPathOffset属性:
该属性指定结果路径的位移距离,取值为0~1,当取值为 0时,不进行位移,当取值为1时,位移整条路径的长度
  • android:pathData属性,在path标签中,主要通过pathData属性来指定SVG图像的显示内容,所以我们来看 pathData的属性:
M = moveTo(MX, Y):将画笔移动到指定的坐标位置
L = lineTo(L X, Y):画直线到指定的坐标位置
H = horizontal lineTo(H X):画水平线到指定的X坐标的位置
V = vertical  lintTo(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):弧线
Z  = closepath():关闭路径

eg: A指令画一条弧线, 且弧线不闭合,A指令的各参数如下:

RX, RY指所欲椭圆的半轴大小
XROTATION指椭圆X轴和水平方向顺时针方向的夹角,即一个水平的椭圆绕着中心点顺时针旋转XROTATION角度
FLAG1只有两个值,1表示大角度弧度,0表示小角度弧度
FLAG2只有两个值。确定从起点到终点的方向,1表示顺时针,0表示逆时针
X, Y为终点坐标
注意:
  • 坐标轴以(0, 0)为原点,x轴水平向右, y轴水平向下
  • 所有指令大小写均可,大写表示绝对定位,小写表示相对定位,所参照的对象一个是全局坐标一个是局部坐标
  • 指令和数字间的空格可以省略
  • 同一指令出现多次可以只用一个
group标签:
  • path标签用于定义可绘图的路径,而group标签则用于定义一系列路径或者将path标签分组,主要应用于动画中,通过group标签可以将原本有一个path路径实现的内容分为多个path路径,每一个path指定一个特定的动画
group标签的使用十分的随意:

在这里插入图片描述

group标签的使用:
  • android:name:组的名字,用于与动画相关联

  • android:rotation:指定该组图像的旋转度数

  • android:pivotX:定义缩放和旋转该组时的X参考点,该值是相对于Vector的viewport值来确定的

  • android:pivotY:定义缩放和旋转该组时的Y参考点,该值是相对于Vector的viewport值来确定的

  • android:scaleX:指定该组X轴缩放大小

  • android:scaleY:指定该组Y轴缩放大小

  • android:translateX:指定该组沿着X轴平移的距离

  • android:translateY:指定该组沿着Y轴平移的距离

制作SVG图像:
  1. 设计软件:软件地址
  2. Iconfont:阿里巴巴矢量图库 将想要的矢量图打包成一个.ttf文件
引入SVG图像:
  1. 在线转换:传送门 直接将图片拖入并直接拷贝出xml就可以
  2. 通过android studio引入:drawable右键new选择Vector asset
    在这里插入图片描述

eg:

  • 使用ImageView显示SVG图像
<ImageView    
android:id="@+id/svg_first"    
android:layout_width="wrap_content"    
android:layout_height="wrap_content"    
android:src="@drawable/rotation" 或者app:srcCompat="@drawable/svg_first" />
上述的两种使用方式基本没有差别,第二种主要是为了做兼容
  • 在Button,RadioButton中使用
    • Button并不能使用src或者srcCompat, 需要通过selector来使用
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">    
<item        
android:drawable="@drawable/svg_first"        
android:state_pressed="true" />    
<item 
android:drawable="@drawable/svg_first"/>
</selector>

<Button    
    android:id="@+id/btn_svg"    
    android:layout_width="100dp"    
    android:layout_height="100dp"    
    android:background="@drawable/selector_first"/>
动态Vector
  • 首先声明一个Vector svg图像
  • 然后在Animator文件下定义一个Animator文件
  • 然后在drawable目录下创建一个animate-vector标签的文件
 <?xml version="1.0" encoding="utf-8"?>
 <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"    
    <!--指定Vector图像-->
    android:drawable="@drawable/svg_first">    
    <target       
        <!--通过target标签和动画相关联,target的name就是指定Vector中的path的name, 两者必须相同, target标签就是将path和动画进行绑定,可以有多个target标签-->
        android:name="bar"       
        <!--绑定动画-->
        android:animation="@animator/anim_trim_svg"/>
 </animated-vector>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值