VectorDrawable基础知识

2023-10-21 01:20

本文主要是介绍VectorDrawable基础知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、概述

VectorDrawable是用xml文件定义一系列点、线、曲线及其颜色信息的矢量图。其最主要的优点是缩放不损失图片质量。我们也可以通过使用多个xml矢量图文件来做动画,从而避免适配多分辨率使用多张图片。 从android 5.0(api 21),系统提供了VectorDrawable与AnimatedVectorDrawable来支持矢量图。

2、 关于VectorDrawable

VectorDrawable定义一个静态的drawable对象。类似svg格式,每个矢量图被定义成由path和gourp对象构成的树状结构。
每个path包含了对象的几何轮廓,group包含了变化的具体规则。所有的path会按照xml中定义的顺序依次绘制。
此处插入官网图

vectordrawable文件说明

android studio中的vector asset studio提供了非常简单的添加xml文件矢量图的功能。
如下为一个矢量电池图片的xml文件。

<!-- res/drawable/battery_charging.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"<!-- intrinsic size of the drawable -->android:height="24dp"android:width="24dp"<!-- size of the virtual canvas -->android:viewportWidth="24.0"android:viewportHeight="24.0"><group
         android:name="rotationGroup"android:pivotX="10.0"android:pivotY="10.0"android:rotation="15.0" ><path
        android:name="vect"android:fillColor="#FF000000"android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z"android:fillAlpha=".3"/><path
        android:name="draw"android:fillColor="#FF000000"android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z"/></group>
</vector>

使用矢量图xml文件必须在AppCompatImageView中使用或者利用StateListDrawable,如下

<android.support.v7.widget.AppCompatImageViewandroid:id="@+id/iv_scale_test"android:layout_width="20dp"android:layout_height="20dp"app:srcCompat="@drawable/test_vector_battery"/>

渲染后的图形如下

vector-battery

3、关于AnimatedVectorDrawable

AnimatedVectorDrawable为矢量图增加了动画信息。动画矢量图可以通过三个单独的资源文件定义,也可以通过一个单独的文件定义整个drawable。

3.1、利用多个文件定义动画矢量图

构建动画矢量图时,需要如下文件
- Vecotr Drawable xml文件
- AnimatedVectorDrawable xml文件,其中定义了目标Vector Drawable,要动画的目标paths及groups,及其通过ObjectAnimator或者AnimatorSet定义的目标对象。
- animator动画文件
三个示例文件分别如下

VectorDrawable xml文件

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:height="64dp"android:width="64dp"android:viewportHeight="600"android:viewportWidth="600" ><group
      android:name="rotationGroup"android:pivotX="300.0"android:pivotY="300.0"android:rotation="45.0" ><path
         android:name="vectorPath"android:fillColor="#000000"android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /></group>
</vector>

AnimatedVectorDrawable xml文件

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/vd" ><target
         android:name="rotationGroup"android:animation="@anim/rotation" /><target
         android:name="vectorPath"android:animation="@anim/path_morph" />
</animated-vector>

animator xml文件,如下定义两个动画

<objectAnimator
   android:duration="6000"android:propertyName="rotation"android:valueFrom="0"android:valueTo="360" /><set xmlns:android="http://schemas.android.com/apk/res/android"><objectAnimator
      android:duration="3000"android:propertyName="pathData"android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"android:valueType="pathType"/>
</set>

在项目中使用如下代码开始动画
((AnimatedVectorDrawableCompat) mTestImg.getDrawable()).start(); 或者转型为Animatedable对象,然后调用start()方法。

3.2、利用单个文件定义动画矢量图

示例代码如下:

<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector
            android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><path
                android:name="root"android:strokeWidth="2"android:strokeLineCap="square"android:strokeColor="?android:colorControlNormal"android:pathData="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7" /></vector></aapt:attr><target android:name="root"><aapt:attr name="android:animation"><objectAnimator
                android:propertyName="pathData"android:valueFrom="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7"android:valueTo="M6.4,6.4 L17.6,17.6 M6.4,17.6 L17.6,6.4"android:duration="300"android:interpolator="@android:interpolator/fast_out_slow_in"android:valueType="pathType" /></aapt:attr></target>
</animated-vector>

其中aapt标记创建了单独的资源并且在矢量文件中引用。这种方式需要24版本以上的构建工具。

4、xml矢量文件中的元素

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 设置斜角的上限

group的可选项释义

group :主要是用来设置路径做动画的关键属性的

android:name 定义 group 的名字

android:rotation 定义该 group 的路径旋转多少度

android:pivotX 定义缩放和旋转该 group 时候的 X 参考点。该值相对于 vector 的 viewport 值来指定的。

android:pivotY 定义缩放和旋转该 group 时候的 Y 参考点。该值相对于 vector 的 viewport 值来指定的。

android:scaleX 定义 X 轴的缩放倍数

android:scaleY 定义 Y 轴的缩放倍数

android:translateX 定义移动 X 轴的位移。相对于 vector 的 viewport 值来指定的。

android:translateY 定义移动 Y 轴的位移。相对于 vector 的 viewport 值来指定的。

clip-path释义

clip-path定义当前绘制的剪切路径。clip-path只对当前的group和子group有效。

android:name 定义clip path的名字

android:pathData 和 path中的 android:pathData 的取值一样。

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_in

android:autoMirrored 设置当系统为 RTL (right-to-left)
布局的时候,是否自动镜像该图片。比如 阿拉伯语

android:alpha 该图片的透明度属性

5、Vector Drawables的兼容问题

为了兼容api21以下版本,系统提供了2个支持库support-vector-drawable及animated-vector-drawable,其中分别包含了VectorDrawableCompat和AnimatedVectorDrawableCompat。其中VectorDrawableCompat可以兼容到api 7,AnimatedVectorDrawableCompat可以兼容到api11。

通过如下配置来使用vectorDrawable支持库

//For Gradle Plugin 2.0+android {defaultConfig {vectorDrawables.useSupportLibrary = true}}
(低于1.5或者更低版本的gradle配置方法见官网)

在加载drawable时,不是所有接受drawable id的地方都可以使用vector drawable的。当在使用矢量图像时用app:srcCompat替换android:src,在代码中可以使用 setImageResource() 来设置图片源。
为了更好的渲染,建议在定义矢量图片时设置为黑色,然后利用android:tint着色。

6、版本问题

com.android.support:appcompat-v7包25.4.0及以上版本的支持库才有以下特性:
1.path渐变 从一个path渐变到另外一个path。(即使使用了在api21以下的手机上无效,只是不报错而已)
2.path变化的插值器
com.android.support:appcompat-v7包26.0.0-beta1及更高的支持库有以下特性:
1.沿着path移动任意对象。(这一点不是很理解)
注意,在不支持的版本上应用以上特性可能会造成crash。

7、参考:

  1. https://developer.android.com/guide/topics/graphics/vector-drawable-resources.html
  2. https://developer.android.com/studio/write/vector-asset-studio.html#importing

这篇关于VectorDrawable基础知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/250968

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结构:总线型 星型(逻辑总线型) 介质访问控制  静态划分信道 信道划分介质访问控制 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 动态分配信道 轮询访问介质访问控

Gitflow基础知识

0.理想状态 现状 听完后的理想状态 没使用过 git 知道 git 是什么,会用 git 基础流程命令 用过 git,但只通过图形化界面操作 脱离图形化界面操作,通过 git 命令操作 会 git 命令 掌握 gitflow 规范,合理使用 rebase 和解决代码冲突问题 1.Git 的基础流程&命令 1.1 基础概念 工作区:代码生产基地,pycharm

[JAVA基础知识汇总-1] 创建线程的几种方式

文章目录 1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 线程池 可以认为有四种方式,也可以认为有一种,因为都跟Runnable接口有关 1. 继承Thread类 代码 public class Thread1ExtendsThread extends Thread {// public Thread1(String n