Android5.0之后 VectorDrawable实现超炫酷动画效果

标签介绍:

<vector>, <group>, <clip-path>,<animated-vector> 项目中还是用到了一些动画的标签,这里就不做展示了

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 设置路径截取的范围,取值范围从 0 到1
android:strokeLineCap 设置路径线帽的形状,取值为 butt, round, square.
android:strokeLineJoin 设置路径交界处的连接方式,取值为 miter,round,bevel.
android:strokeMiterLimit 设置斜角的上限文

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_inandroid:autoMirrored 设置当系统为 RTL (right-to-left) 布局的时候,是否自动镜像该图片。
android:alpha 该图片的透明度属性

首先创建一个vectorDrawable
先展示一下效果图

</br>


登录界面的vectorDrawable
现在看上去还是没一点鸟用哈,也没什么特点,下一篇博客将给你惊喜,这里就不管它了

</br>
注意:这里宽高(width和height的比例及viewportHeight和viewportWidth比例)的比例很重要,这个比例必须和布局文件中宽高比例一直,比如布局文件中的宽是300dp,高是100dp,那么宽高的比例就是3:1,所以在vector中的宽高比例就是3:1

不要怪我啰嗦,因为你如果不对应,导致的直接结果就是显示后的图形是拉伸或是压缩的,然后你可能会想。我改一下就好了,那恭喜你你成功给自己挖了一个大坑,全是计算

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="75dp"
    android:height="25dp"
    android:viewportHeight="40"
    android:viewportWidth="120">
        <path
            android:name="firstHLine"
            android:pathData="M 0,20 l 90,0"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="circleTop"
            android:pathData="M 90,20
            A 9,9 0,1,0 81,11"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="true"
            android:pathData="M 81,11 l 4,6 l 10,-8"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeLineCap="round"
            android:strokeWidth="0.5" />
        <path
            android:name="circleBouttom"
            android:pathData="
            M90,20
            A 9,9 0,1,1 90,38"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="secondHLine"
            android:pathData="M 0,38 l 90,0"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
</vector>
没错我第一次看到vector的时候也是一脸懵逼,这t m是啥呀,全是字母加数字,那就具体来解释一下吧

</br>
vectorDrawable支持的指令:

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 curveto(T ENDX,ENDY):映射
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):画圆弧。分别对应: x轴半径,y轴半径,x轴偏移量,弧度(0代表取小弧度,1代表取大弧度) ,方向(0取逆时针,1为顺时针),目标X坐标,目标y坐标。(当rx=ry时就是一个圆,但是终点坐标要对哈)

Z = closepath():关闭路径

注意:这里字母大写和字母小写也是有讲究的,大写代表当前空间的绝对位置,小写代表相对位置,比如M(10,10)指的是移动到当前空间的x=10,y= 10这个位置(绝对位置),m(10,10)则指的是从当前点向右10个单位位置的点,并从当前点向下10个单位位置的点(相对位置)
这里提一下至于数字中间用逗号间隔,还是用空格来隔开都没关系,根据个人喜好

测试大写和小写分别对应的效果,代码如下
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="100"
    android:viewportWidth="100">
    <path
        android:pathData="M 0,10,L 100,10"
        android:strokeColor="@android:color/holo_red_light"
        android:strokeWidth="2" />
    <path
        android:pathData="M 0,40,l 100,40"
        android:strokeColor="@android:color/holo_blue_light"
        android:strokeWidth="2" />
    <path
        android:pathData="M 0,80,L 100,80"
        android:strokeColor="@android:color/white"
        android:strokeWidth="2" />
</vector>
光文字,干燥,来张图片,醒醒脑
上面路径对应的图

是不是一下感觉就懂了大小写的区别了

接下来就来画一些基本的图形(直线就不画了,上面有了),感受下vectorDrawable

先来画个圆吧
漂亮吧

代码如下

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24"
    android:viewportWidth="24">
    <path
        android:name="circle"
        android:pathData="
        M12,12//定位到当前空间的中心
        m-10,0 //从当前点向左移动10个单位
    a10,10 0 1,1 20,0//在当前点绘制一个以上面的m点为起点半径为10,终点是(20,0),注意小写是相对位置
        a10,10 0 1,1 -20,0"//与上面同理
        android:strokeColor="@color/colorPrimary"
        android:strokeWidth="1" />
    <!--你可能会想为什么要画两个半圆而不是一个整圆,我只能说你可以试试-->
</vector>
再来个难度高点的
懵逼了吧
代码如下
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="200"
    android:viewportWidth="200">
    <path
        android:fillColor="@color/colorAccent"
        android:pathData="
        M10,0
        h180//从当前点向右一条直线,绘制180个单位
        q10,0 10,10//这就是贝赛曲线
        v180//从当前点向下一条直线,绘制180个单位
        q0,10 -10,10
        h -180
        q-10,0 -10,-10
        v-180
        q 0,-10 10,-10
        M 90,100
        a 30,40 -60,1,0 -60 ,10
        c 20,20 40,40 60,60
        c 20,-20 40,-40 60,-60//三次贝赛曲线
        a 30,40 60,1,0 -60 ,-10"
        android:strokeColor="@color/colorPrimary" />
</vector>

**贝赛曲线绘制很简单的,但是实际用到比较少,我暂时就不做讲解了,下一篇博客的文章末尾我会给出一些学习的链接
h和v方法是太简单,读者一试便知,就不绘制了
**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,042评论 25 707
  • Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究...
    eclipse_xu阅读 34,898评论 30 263
  • 1. 矢量图SVG简介 Android 5.0系统中引入了 VectorDrawable 来支持矢量图(SVG),...
    登高且赋阅读 2,535评论 2 15
  • 感赏自己情绪越来越稳定,觉察力提升,可以与负面情绪很好的相处。 感赏每天出门都能见证到豹子号,小红帽练习得到实现的...
    雨过天晴感悟阅读 142评论 0 0
  • 忽然发现现在时刻想起的都是和他的回忆,而不是过去。 堵车,想起和他在岱山堵车;地铁,想起和他在上海的地铁上;看电视...
    不小不阅读 143评论 0 0