图片和图形之矢量绘制(Vector drawables)(3)

2023-10-18 09:10

本文主要是介绍图片和图形之矢量绘制(Vector drawables)(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文

概述

A VectorDrawable是一个矢量图形,在XML文件中定义为一组点,线和曲线及其相关的颜色信息。使用矢量绘图的主要优点是图像可伸缩性。它可以在不损失显示质量的情况下进行缩放,这意味着相同的文件可以根据不同的屏幕密度调整大小,而不会损失图像质量。这会导致更小的APK文件和更少的开发人员维护。对于每种显示分辨率,您还可以使用多个XML文件而不是多个图像来使用矢量图像进行动画。

Android Studio也可以将SVG文件转换为矢量可绘制格式

Android 5.0(API级别21)是第一个使用VectorDrawable 和正式支持向量绘制的版本 AnimatedVectorDrawable,但您可以使用支持Android的支持库来支持旧版本,该支持库提供了 VectorDrawableCompat和 AnimatedVectorDrawableCompat类。

关于VectorDrawable类

VectorDrawable定义一个静态可绘制对象。类似于SVG格式中,每个矢量图形被定义为一个树层次结构,其是由path与group对象。每个都path包含对象轮廓的几何图形并 group包含用于转换的详细信息。所有路径的绘制顺序与它们在XML文件中的显示顺序相同

示例XML
以下是一个示例VectorDrawableXML文件,用于在充电模式下呈现电池图像。

<!-- 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"><groupandroid:name="rotationGroup"android:pivotX="10.0"android:pivotY="10.0"android:rotation="15.0" ><pathandroid: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"/><pathandroid: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呈现以下图像:
图片和图形之矢量绘制(Vector drawables)(3)

关于AnimatedVectorDrawable类

AnimatedVectorDrawable将动画添加到矢量图形的属性中。您可以将动画矢量图形定义为三个单独的资源文件或定义整个绘图的单个XML文件。让我们看看两种方法,以便更好地理解:多个XML文件和单个XML文件。

多个XML文件

  • 一个VectorDrawableXML文件。
  • AnimatedVectorDrawable定义目标 的XML文件,VectorDrawable要设置动画的目标路径和组,动画,定义为ObjectAnimator对象或 AnimatorSet对象的属性和动画。
  • 动画师XML文件。

多个XML文件的示例

  • VectorDrawable的XML文件: vd.xml
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="64dp"
    android:width="64dp"
    android:viewportHeight="600"
    android:viewportWidth="600" >
    <groupandroid:name="rotationGroup"android:pivotX="300.0"android:pivotY="300.0"android:rotation="45.0" ><pathandroid:name="vectorPath"android:fillColor="#000000"android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
    </group>
    </vector>
  • AnimatedVectorDrawable的XML文件: avd.xml
    <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vd" ><targetandroid:name="rotationGroup"android:animation="@anim/rotation" /><targetandroid:name="vectorPath"android:animation="@anim/path_morph" />
    </animated-vector>
  • AnimatedVectorDrawable的XML文件中使用的Animator XML文件:rotation.xml和path_morph.xml
    <objectAnimator
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360" />
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimatorandroid: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>

单个XML文件

通过使用这种方法,您可以通过XML捆绑格式将相关的XML文件合并到一个XML文件中。在构建应用程序时, aapt标记会创建单独的资源并在动画矢量中引用它们。这种方法需要构建工具24或更高版本,并且输出是向后兼容的。
单个XML文件的示例

<animated-vectorxmlns:android="http://schemas.android.com/apk/res/android"xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vectorandroid:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><pathandroid: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"><objectAnimatorandroid: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>

向量drawables向后兼容性解决方案

要支持运行平台版本低于Android 5.0(API级别21)的设备上可绘制的矢量可绘制和动画矢量, VectorDrawableCompat 并且AnimatedVectorDrawableCompat 可通过两个新的支持库分别获得: support-vector-drawable和animated-vector-drawable。

Android Studio 1.4通过在构建时生成PNG文件,引入了对矢量绘图的有限兼容性支持。然而,矢量可绘制和动画矢量可绘制支持库提供了灵活性和广泛的兼容性 - 它是一个支持库,因此您可以将它与所有Android平台版本一起使用回到Android 2.1(API等级7+)。要将应用配置为使用矢量支持库,请将该vectorDrawables 元素添加到build.gradle应用模块中的文件中。

使用下面的代码片段来配置vectorDrawables 元素:

//For Gradle Plugin 2.0+android {defaultConfig {vectorDrawables.useSupportLibrary = true}}
//For Gradle Plugin 1.5 or below
android {defaultConfig {// Stops the Gradle plugin’s automatic rasterization of vectorsgeneratedDensities = []}// Flag notifies aapt to keep the attribute IDs aroundaaptOptions {additionalParameters "--no-version-vectors"}
}

您可以使用VectorDrawableCompat API级别7以及 AnimatedVectorDrawableCompat运行Android 3.0(API级别11)及更高级别的所有设备。Android加载drawable的方式并不是每个接受可绘制ID的地方都支持加载向量drawable。该 android.support.v7.appcompat软件包添加了许多功能,以便于使用矢量绘图。首先,当你使用 android.support.v7.appcompatpackage ImageView或with ImageButton和诸如and的 子类时 FloatingActionButton,可以使用new app:srcCompat属性来引用矢量绘图以及任何其他可绘制的drawable android:src:

<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:srcCompat="@drawable/ic_add" />

要在运行时更改drawable,可以setImageResource() 像以前一样使用该 方法。使用AppCompat 和app:srcCompat是将矢量绘图集成到您的应用程序的最简单的方法。

Support Library 25.4.0及更高版本支持以下功能:

* 路径变形(PathType评估器)用于将一个路径变形为另一个路径。
* 路径插值用于定义灵活的插补器(表示为路径),而不是系统定义的插补器,如LinearInterpolator。

支持库26.0.0-beta1及更高版本支持以下功能:

* 沿路径移动几何对象可以沿任意路径移动,作为动画的一部分。

使用支持库的多个XML文件的示例
以下XML文件演示了使用多个XML文件为矢量图形制作动画的方法。

* VectorDrawable的XML文件: vd.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"android:height="64dp"android:width="64dp"android:viewportHeight="600"android:viewportWidth="600" ><groupandroid:name="rotationGroup"android:pivotX="300.0"android:pivotY="300.0"android:rotation="45.0" ><pathandroid:name="vectorPath"android:fillColor="#000000"android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /></group>
</vector>
  • AnimatedVectorDrawable的XML文件: avd.xml

    <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vd" ><targetandroid:name="rotationGroup"android:animation="@anim/rotation" />
    </animated-vector>
  • AnimatedVectorDrawable的XML文件中使用的Animator XML文件: rotation.xml
    <objectAnimator
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360" />

    单个XML文件

    以下XML文件演示了使用单个XML文件为矢量图形制作动画的方法。在构建应用程序时, aapt标记会创建单独的资源并在动画矢量中引用它们。这种方法需要构建工具24或更高版本,并且输出是向后兼容的。

使用支持库的单个XML文件的示例

<animated-vectorxmlns:android="http://schemas.android.com/apk/res/android"xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="64dp"android:height="64dp"android:viewportWidth="600"android:viewportHeight="600"><groupandroid:name="rotationGroup"android:pivotX="300"android:pivotY="300"android:roation="45.0" ><pathandroid:name="vectorPath"android:fillColor="#000000"android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /></group></vector></aapt:attr><target android:name="rotationGroup"><aapt:attr name="android:animation"><objectAnimatorandroid:propertyName="rotation"android:valueFrom="0"android:valueTo="360"android:duration="6000"android:interpolator="@android:interpolator/fast_out_slow_in" /></aapt:attr></target>
</animated-vector>

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

图片和图形之矢量绘制(Vector drawables)(3)

转载于:https://blog.51cto.com/4789781/2120424

这篇关于图片和图形之矢量绘制(Vector drawables)(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意