Android矢量图VectorDrawable

一、前言

我们通常使用的图片有.jpeg.gif.png(三格图) 和.svg(矢量图)放大不失真,存储也方便。

  • 1.三格图:是由一个一个像素点构成的,所以硬件对它处理的时候,非常大的优势。UPU可以根据每个像素点去做计算处理,所以加载数据会很快。
  • 2.矢量图:是有CPU所计算的,绘制的速度会比三格图慢点,但是它的好处在于可缩放性。

如果对三格图进行一定极的缩放,那么图像的边缘会出现很多锯齿。那是因为三格图不具有缩放性的,那么矢量图不一样,因为它的每一个点是由CPU计算出来的。
所以经行任何比例的缩放,它都不会失真。这一点就是矢量图与三格图最大的差距。

二、什么是SVG

SVG--前端中使用,是一套语法规范。在android中就是矢量图。Vector ---在Android中使用,Vector只实现了SVG语法的Path标签。 SVG有很多语法格式,支持很多标签。Android使用Path标签来模拟其他所有的数据。虽然数据复杂点,但对它的解析效率很大帮助,这样既能保证兼容大部分的SVG图像,同时也极大的提高了解析的数据。Vector在Android的效率极大的提高。

三、Vector的常用的语法

Vector的常用的语法:是一个标注型语法。通过数组和字母的组合来描述一个路径。那么它不同的字母代表不同的含义。

M = moveto(M X,Y):将画笔移动到指定的坐标位置。
L = lineto(L X,Y):画直线到指定的坐标位置
Z = closepath():关闭路径

H = horizontal lineto(H X): 画水平线到指定的X坐标位置
V = vertical lineto(V Y):画垂直线到指定的Y坐标位置

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"              //定义图片的宽高
android:viewportWidth="200.0"     //定义图像被划分的比例大小
android:viewportHeight="200.0">   //定义图像被划分的比例大小

<path
    android:fillColor="#FF000000"
    android:pathData="M50,50 L100,50 L100,100  L50,100 z"/>
</vector>

pathData 表述的是Vector具体的图像。

四、静态的VectorDrawbale

在控件中使用
ImageView\ImageButton
-----app:srcCompat = "@drawable/vector_image"

Button
-----通过Selector来进行设置,并开启下面的设置

 state {
     AppCompatDelegate
     .setCompatVectorFromResourcesEnabled(true);
 }

其中Vector_image的VectorDrawable的代码 (矩形图片)

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="48dp"
    android:height="48dp"
    android:viewportWidth="200.0"
    android:viewportHeight="200.0">

<path
    android:fillColor="#FF000000"
    android:pathData="M50,50 L100,50 L100,100  L50,100 z"/>
</vector>
五、动态的VectorDrawbale

VectorDrawable的优点:缩放不失真 和 使PNG的体积大幅度减小 还可以更好的使用动画。要使属性动画作用在具体的VectorDrawable中去,需要配置动画的粘合剂。

配置动画的粘合剂-----------animated-vector ( animated-vector +animator(属性动画))

<?xml version="1.0" encoding="utf-8"?>
<animated-vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_arrow_forward_black_24dp">

<target
    android:animation="@animator/animator"
    android:name="left"/>
<target
    android:animation="@animator/animator_right"
    android:name="right"/>
</animated-vector>

向左平移属性动画

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:repeatMode="reverse"
    android:repeatCount="infinite"
    android:propertyName="translateX"
    android:valueFrom="0"
    android:valueTo="10"
    android:valueType="floatType">
</objectAnimator>

向右平移属性动画

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:repeatMode="reverse"
    android:repeatCount="infinite"
    android:propertyName="translateX"
    android:valueFrom="0"
    android:valueTo="-10"
    android:valueType="floatType">
</objectAnimator>

VectorDrawable箭头图片代码

<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:name="left">
      <path
         android:fillColor="#FF000000"
         android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
  </group>

  <group android:name="right">
      <path
          android:fillColor="#FF000000"
          android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
  </group>
</vector>

VectorDrawable属性动画代码实现

public void anim(View view) {
    ImageView imageView = (ImageView) view;
    Drawable drawable = imageView.getDrawable();
    if(drawable instanceof Animatable) {
        ((Animatable)drawable).start();
    }
}

VectorDrawable可以通过配置其长度、颜色、位置等属性值,以及配置动画的粘合剂,达到你预想不到的动画效果。

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

推荐阅读更多精彩内容