Android Studio包含一个Vector Asset Studio的工具,可以帮助你添加Material图标和导入SVG(Scalable Vector Graphic)文件到你的项目中作为向量drawable资源。使用向量drawable资源来代替图片可以减少APK的大小,因为同样一个文件可以在不损失图片质量的情况下改变大小来适应不同分辨率的屏幕。旧版本的Android不支持向量drawable,Vector Asset Studio可以在构建的时候,帮助你把向量drawable转化成不同大小的图片。

关于Vector Asset Studio

Vector Asset Studio会将向量图片以XML文件描述的形式添加到项目中。维护一个XML文件要比维护多个分辨率的图片要简单很多。

Android4.4(API level 20)或更低的版本不支持向量drawable。如果过你的最小API level低于20,在使用Vector Asset Studio时有两个选项:生成PNG文件(默认)或者使用Support Library。

为了保持向后兼容,Vector Asset Studio生成向量drawable的栅格化图片。向量和栅格化资源会一起打包到APK文件中。在Java代码中,你可以视为向量资源为Drawable或者在XML代码中卫@drawable;当你的应用运行的时候,会根据当前系统的API版本来决定是使用向量资源还是栅格图片。

再者,为了使用Android Support Library 23.2或更高版本,你可以在build.gradle文件中添加一些声明。

支持的向量图片类型

谷歌material design规范提供了material图标,你可以直接应用于你的Android应用中。Vector Asset Studio帮助你选择,导入和更改material图标的大小。

Vector Asset Studio也可以帮助你导入你自己的SVG文件。SVG是一个基于XML的W3C的标准。Vector Asset Studio支持必要的标准,但并不是所有的特性。当你声明一个SVG文件,Vector Asset Studio告诉你是否支持这个图片代码。如果这个SVG代码不支持,它将这个文件转化为包含VectorDrawable代码的XML文件。

SVG文件的思考

一个向量drawable对于一个简单的图标是可以的。Material图标提供了非常好的图片类型的例子,转换成向量drawable也非常好。但是,很多app运行图标包含太多细节,所以它们比较适合用栅格化图片。

向量图片的初始化载入要比栅格化图片花费更多的CPU资源。之后,内存使用和性能两者是相同的。建议将向量图片限制为最大200*200 dp,否则,将会花费大量时间绘制。

虽然向量drawable支持一个或多个颜色,在许多情况下图标颜色都是黑色的(android:fillColor=”#FF000000”),利用这个特性,你可以在布局中使用的向量drawable中添加一个tint。图标颜色颜色将变成tint颜色。如果图标颜色不是黑色,图标颜色可能与tint颜色混合。

运行Vector Asset Studio

为了打开Vector Asset Studio,通过如下方式:

1、 在Android Studio中,打开一个Android应用项目。

2、 在Project窗口中,选择Android视图。

3、 右键单击res文件夹,选择New > Vector Asset。

Vector Asset Studio显示:

导入一个向量图像

Vector Asset Studio帮助你导入一个向量图像到你的app项目中。

添加一个material图标

1、 在Vector Asset Studio中,选择Material Icon

2、 选择Choose

3、 选择一个material图标并点击OK

图标出现在Vector Drawable Preview中。

4、 可选的,你可以更改资源名称,大小,透明度和RTL镜像设置。

5、 点击Next

6、 可选的。更改模块和资源目录。

7、 点击完成。

Vector Asset Studio添加一个定义了向量drawable的一个XML到你的项目的app/src/main/res/drawable/ 文件夹中。

8、 构建项目。

如果你的最小API level 是Android4.4或者更低,而且没有添加Support Library,Vector Asset Studio生成PNG文件,你不可以修改这些文件。

导入一个SVG文件

在打开Vector Asset Studio之后,你可以通过如下方式导入一个SVG文件:

1、 在Vector Asset Studio中,选择Local SVG file

文件必须是在本地。如果是在网上,你需要先下载到本地。

2、 点击需要导入的图片

图片显示在Vector Drawable Preview。

然而,如果SVG文件包含不支持的特性,将会在Vector Asset Studio的底部报出一个错误,如下:



3、 可选的。更改资源的名称、大小、透明度等设置

4、 点击Next

5、 可选的。更改模块和资源目录。

6、 点击Finish。

7、 构建项目。

如果你的最小API level 是Android4.4或者更低,而且没有添加Support Library,Vector Asset Studio生成PNG文件,你不可以修改这些文件。

添加一个向量Drawable到布局中

在一个布局文件中添加任何可以使用图标的控件,比如ImageButton,ImageView等等,指向一个向量资源。比如:下面的布局中在一个按钮中显示向量资源。



设置一个向量资源到控件中,执行如下几步:

1、 打开一个项目,导入一个向量资源

2、 在Project窗口的Android视图中,双击一个布局XML文件,比如content_main.xml

3、 点击Design 打开布局编辑器

4、 从Palette窗口中拖动ImageButton控件到布局编辑器中。

5、 在Properties窗口,定位到ImageButton的src属性,点击…

6、 在Resources对话框中,选择Project,导航到Drawable文件夹,选择一个向量资源。点击OK。

向量资源显示在ImageButton布局中。

7、 为了更改图片的颜色,可以设置tint属性。

如果你没有使用Support Library,ImageButton代码如下:

  1. <ImageButton
  2. android:id="@+id/imageButton"
  3. android:src="@drawable/ic_build_24dp"
  4. android:tint="@color/colorAccent"
  5. android:layout_width="wrap_content"
  6. android:layout_height="wrap_content"
  7. android:layout_below="@+id/textView2"
  8. android:layout_marginTop="168dp" />

在代码中使用一个向量Drawable

你可以在代码中用普通的方式来调用一个向量资源。当你运行一个app时,会根据你的API版本来判断显示向量或者栅格化图片。

在大部分情况下,你可以通过@drawable或Drawable访问向量资源。如下:

  1. <ImageView
  2. android:layout_height="wrap_content"
  3. android:layout_width="wrap_content"
  4. android:src="@drawable/myimage" />

如下:

  1. Resources res = getResources();
  2. Drawable drawable = res.getDrawable(R.drawable.myimage);

如下:

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  2. VectorDrawable vectorDrawable = (VectorDrawable) drawable;
  3. } else {
  4. BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
  5. }

修改由Vector Asset Studio生成的XML代码

你可以修改向量资源的XML代码,但是不是PNG文件和在构建时生成的XML代码。但是,这种方式并不推荐。

本文作者:宋志辉

个人微博:点击进入

2.5、Android Studio添加多适配的向量图片的更多相关文章

  1. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  2. Eclipse / android studio 添加第三方jar包 步骤

    eclipse 将第三方包放到libs文件夹后并没有引用. 基本步骤分为3步,具体介绍如下: 打开自己的Eclipse,在自己的Android工程上名上右键->Build Path ->C ...

  3. Android Studio 添加Assets目录

    Android Studio 添加Assets目录: 法一: Since Android Studio uses the new Gradle-based build system, you shou ...

  4. 【Android Studio安装部署系列】十五、Android studio添加Assets目录

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio新建项目时是没有assets目录,需要自己手动创建. app右键——New——Folder——Asset ...

  5. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  6. android studio 添加get,set方法快捷方式

    android studio 添加get,set方法快捷方式

  7. Android studio 添加admob googgle play services

    Android studio 添加admob googgle play services MainActivity import com.google.android.gms.ads.AdReques ...

  8. Android Studio 添加 Genymotion插件

    原文:Android Studio 添加 Genymotion插件 1.下载Genymotion:官网地址,必须先注册才能下载,下载带有VirtualBox的版本 2.安装:安装时会连VirtualB ...

  9. Android Studio(六):Android Studio添加注释模板

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

随机推荐

  1. UVA - 11107:Life Forms

    后缀数组height+二分 #include<cstdio> #include<cstdlib> #include<algorithm> #include<c ...

  2. ●POJ 3974 Palindrome(Manacher)

    题链: http://poj.org/problem?id=3974 题解: Manacher 求最长回文串长度. 终于会了传说中的马拉车,激动.推荐一个很棒的博客:https://www.61mon ...

  3. 2015 多校联赛 ——HDU5349(水)

    Problem Description A simple problem Problem Description You have a multiple set,and now there are t ...

  4. [Apio2009][bzoj1179]Atm

    题意:一个n个点m条单向边的图,每个点有权值,给定出发点和p个可以停止的点,你可以随便走一条路径从出发点走到一个可以停止的点,但是每个点的点权只能计算一次,求能得到的最大权值. n,m<=500 ...

  5. LCT模板(BZOJ2631)

    用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和. #include <cstdio> #include <algorithm> #define l(x) ...

  6. Python【第五课】迭代器,生成器,数据序列化

    本节内容 列表生成式,生成器,迭代器 Json & pickle 数据序列化 1.列表生成式,生成器,迭代器 1.1 列表生成式 列表生成式?不就是生成个列表的表达式,恩~~~ 差不多. 一般 ...

  7. Linux 基本概念和操作2

    接着上一篇 "Linux 基本概念和操作" 1.删除文件 有时候我们想要删除的文件是只读文件,直接使用rm 文件名,会报错.这时使用" -f " 参数强制删除. ...

  8. 实现一个ordeeddict

    class MyOrderdict(): def __init__(self, mydict): self._cur = 0 self._mykeys = [] self._myvalues = [] ...

  9. struts2 可以用ognl拿到值而不可以用el拿到值的解决方法

    错误debug后 得到了There is no read method for container的错误 于是我new了一个实体类 package com.unity; public class St ...

  10. SQL部分常用指令整理

    dual 伪表 用来测试函数和表达式 1.查询EMP表中所有人的信息,结果格式样例为"某人的月薪是1000$" SELECT ENAME||'的月薪是'||SAL||'$' FRO ...