阿里矢量图标
可缩放向量图形(Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维向量图形的图形格式。SVG由W3C制定,是一个开放标准。
-
SVG何以可以任意缩放而不会失真,drawable-(m|h|xh|xxh|xxxh)dpi和mipmap-(m|h|xh|xxh|xxxh)dpi这俩货就可以省省了;
-
SVG文件一般都比较小,省去很去资源达到apk缩包的目的;
-
SVG占用内存非常小,性能高。但是SVG明显的缺点是没有位图表达的色彩丰富;
Android API 21(5.0)引入了一个Drawable的子类VectorDrawable目的就是用来渲染矢图,AnimatedVectorDrawable用来播放矢量动画。之前老的小于21的API设备可以分别使用VectorDrawableCompat和AnimatedVectorDrawableCompat这两个兼容包来同样达到渲染矢量图的目的。本文只讨论矢量图,不讨论矢量动画。 -
minSdkVersion>=21
:用xml文件或者代码定义VectorDrawable,和普通的Drawable用法一样,不再需要额外任何东西;如何编写矢量图,下文有介绍. -
minSdkVersion<21
:如果想要渲染矢量图的话必须在app模块的build.gralde文件里添加一行代码 -
minSdkVersion<21以及更多
:上面的第二种情况是使用兼容包,但是兼容包仅支持AppCompatImageView和AppCompatImageButton及其子类矢量图,而且矢量图的引用必须放在app:srcCompat属性中才会被识别并生效,代码必须这样写才行:
<android.support.v7.widget.AppCompatImageView
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="100dp"
android:layout_height="100dp"
app:srcCompat="@drawable/ic_oval"/>
ic_oval.xml是我们使用xml编写的矢量图,如果想要TextView的drawableTop或者其他额外方式使用矢量图渲染,那么必须在Activity中加入代码:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
示例:
在drawable目录下新建drawable resource
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:alpha="1"
android:name="@string/app_name"
android:autoMirrored="true"
android:viewportHeight="1024"
android:viewportWidth="1024">
<path
android:pathData="M512 512m-448 0a448 448 0 1 0 896 0 448 448 0 1 0-896 0Z"
android:fillColor="#FA5151" />
<path
android:pathData="M512 620c-17.7 0-32-14.3-32-32V300c0-17.7 14.3-32 32-32s32 14.3 32 32v288c0 17.7-14.3 32-32 32z"
android:fillColor="#FFFFFF" />
<path
android:pathData="M512 718m-38 0a38 38 0 1 0 76 0 38 38 0 1 0-76 0Z"
android:fillColor="#FFFFFF" />
</vector>
效果如下:
标签:
<vector>
定义一个vector的drawable
android:name
命名vector
android:width
用来限定drawable的宽度,支持所有尺寸单位,通常使用dp
android:height
用来限定drawable的高度,支持所有尺寸单位,通常使用dp
android:viewportWidth
用来定义视口的宽度,视口基本上是绘制路径的虚拟画布
android:viewportHeight
用来定义视口的高度,视口基本上是绘制路径的虚拟画布
android:tint
作为色调应用于可绘制对象的颜色。 默认情况下,不应用任何色调
android:tintMode
色调颜色的 Porter-Duff
混合模式。 默认为 src_in
。
android:autoMirrored
代表当drawable的布局方向为RTL(从右到左)时是否需要对其进行镜像。 默认为false
android:alpha
这个drawable的不透明度。 默认值为 1.0(0代表透明,1代表不透明)。
<group>
定义一组路径或子组,以及转换信息。 转换在与视口相同的坐标中定义。 并按比例顺序应用变换,旋转然后平移。
android:name
命名group
android:ratation
group的旋转角度默认0
android:pivotX
用于组缩放和旋转的枢轴的 X 坐标。 这是在视口空间中定义的。 默认值为 0。
android:pivotY
用于组缩放和旋转的枢轴的 Y 坐标。 这是在视口空间中定义的。 默认值为 0。
android:scaleX
X 坐标上的缩放量。 默认值为 1。
android:scaleY
Y 坐标上的缩放量。 默认值为 1。
android:translateX
X 坐标上的平移量。 这是在视口空间中定义的。 默认值为 0。
android:translateY
Y 坐标上的平移量。 这是在视口空间中定义的。 默认值为 0。
<path>
定义画的路径
android:name
命名path
android:pathData
使用与 SVG 路径数据中的“d”属性完全相同的格式定义路径数据。 这是在视口空间中定义的。详细请参考参考
android:fillColor
指定用于填充路径的颜色。 可能是一种颜色,或者对于 SDK 24+ 来说,是一种颜色状态列表或 一种渐变颜色(参见 R.styleable.GradientColor 和 R.styleable.GradientColorItem)。 如果此属性是动画的,则动画 设置的任何值都将覆盖原始值。 如果未指定此属性,则不会绘制路径填充。
android:strokeColor
指定用于绘制路径轮廓的颜色。 可能是一种颜色,或者对于 SDK 24+ 来说,是一种颜色状态 列表或一种渐变颜色(参见 R.styleable.GradientColor 和 R.styleable.GradientColorItem)。 如果此属性是动画的, 则动画设置的任何值都将覆盖原始值。 如果未指定此属性,则不会绘制路径轮廓
android:strokeWidth
路径笔划的宽度。 默认为 0
android:strokeAlpha
路径笔划的不透明度。 默认值为 1。
android:fillAlpha
填充路径的不透明度。 默认值为 1。
android:trimPathStart
从起点开始修剪的路径的分数,范围从 0 到 1。默认值为 0。
android:trimPathEnd
从末端修剪的路径的分数,范围从 0 到 1。默认为 1
android:trimPathOffset
移动修剪区域(允许显示区域包括开始和结束),范围从 0 到 1。默认值为 0。
android:strokeLineCap
设置描边路径的线帽:对接、圆形、方形。 默认是对接。
android:strokeLineJoin
设置描边路径的 lineJoin:斜接、圆形、斜角。 默认为斜接。
android:strokeMiterLimit
设置描边路径的斜接限制。 默认值为 4。
android:fillType
对于 SDK 24+,设置路径的 fillType。 类型可以是“偶数”或“非零”。 它们的行为与SVG 的“填充规则”属性相同。 默认值为非零。 有关更多详细信息,请参阅 FillRuleProperty
<clip-path>
将路径定义为当前剪辑。 请注意,剪辑路径仅适用于当前组及其子组。
android:name
命名 clip-path
android:pathData
使用与 SVG 路径数据中的“d”属性相同的格式定义剪辑路径。