除了动画监听器,动画组合也是各类动画常见的用法,比如把几个补间动画组合起来,就形成了集合动画AnimationSet;把几个属性动画组合起来,就形成了属性动画组合AnimatorSet。那么能否把几个矢量动画在时间上并行组合起来,也形成一种矢量动画组合呢?

比如应用宝的垃圾清理动画,它的初始画面由三个深红色的月牙环绕组成,效果如下图所示:

然后在垃圾清理的过程中,这三个月牙一边转,填充色也一边渐变,月牙转圈动画结束之时,其内部的颜色也从深红色变成了亮绿色,效果下图所示:

只看静态截图还有点抽象,还是观看具体的动画方便理解,下面的动图展示了月牙转动之时、颜色也随之改变的完整过程。

我们知道矢量动画AnimatedVectorDrawable只能由xml文件定义,以支付成功动画的xml描述文件为例,根节点是animated-vector,下级节点是target,完整的xml文件内容如下所示:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/vector_pay_circle_white"><targetandroid:name="circle"android:animation="@anim/anim_pay" />
</animated-vector>

一般animated-vector下面只有一个target节点,那么如果下面挂了好几个target节点会怎么样呢?接下来就来探讨探讨这么做会产生什么反应。

首先对垃圾清理动画进行分解,一方面是月牙的旋转动画,另一方面是月牙填充色的渐变动画。旋转角度和填充颜色其实都属于矢量图形的属性,按照属性动画的做法,只要指定这些属性的起始数值和终止数值,即可让系统自动实现动画的渲染过程。所以垃圾清理动画看起来是由这两个动画组合而成:月牙的旋转动画,以及月牙填充色的渐变动画。
在矢量图形描述中,旋转角度由group节点的rotation参数定义,填充色由path节点的fillColor参数定义,因此接着就要在月牙矢量图形描述中分别定义group节点和path节点。为节约篇幅,下面只给出了第一个月牙图形的矢量定义,第二个和第三个月牙的矢量定义与之类似,仅在pathData的路径数据上有所区别。

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:height="100dp"android:viewportHeight="100"android:viewportWidth="100"android:width="100dp" ><groupandroid:name="clearGroupOne"android:pivotX="50"android:pivotY="50"android:rotation="0" ><pathandroid:name="clearPathOne"android:fillColor="#ff0000"android:pathData="M 10,50A 40 40 60 0 1 50 10A 40 40 60 0 0 25 55A 10 10 60 0 1 10 50"android:strokeAlpha="1"android:strokeColor="@color/transparent"android:strokeLineCap="round"android:strokeWidth="1" /></group><!--此处省略第二个和第三个月牙的矢量描述-->
</vector>

然后依据前面的分析,构造两个属性动画的行为描述,下面是月牙旋转动画的xml描述(改变rotation属性的数值):

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:interpolator="@android:interpolator/linear"android:propertyName="rotation"android:valueFrom="90"android:valueTo="1080"android:valueType="floatType" />

下面是月牙填充色渐变动画的xml描述(改变fillColor属性的数值):

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:interpolator="@android:interpolator/linear"android:propertyName="fillColor"android:valueFrom="#aa0000"android:valueTo="#66ff66"android:valueType="colorType" />

接着在矢量动画的xml描述文件中加入各个动画单位的目标,每个月牙都有旋转和颜色渐变两个动画单位,整个垃圾清理界面有三个月牙,那么总共就需要六个动画单位,于是animated-vector节点下面得补充六个target节点,完整的矢量动画描述如下所示:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/vector_rubbish_clear"><targetandroid:name="clearGroupOne"android:animation="@anim/anim_clear_group" /><targetandroid:name="clearPathOne"android:animation="@anim/anim_clear_path" /><targetandroid:name="clearGroupTwo"android:animation="@anim/anim_clear_group" /><targetandroid:name="clearPathTwo"android:animation="@anim/anim_clear_path" /><targetandroid:name="clearGroupThree"android:animation="@anim/anim_clear_group" /><targetandroid:name="clearPathThree"android:animation="@anim/anim_clear_path" />
</animated-vector>

最后由代码控制矢量动画的播放,点击播放按钮时执行下列代码,即可看到文章开头的垃圾清理动画效果了。

 iv_clear.setImageResource(R.drawable.animated_rubbish_clear);Drawable drawable = iv_clear.getDrawable();if (drawable instanceof AnimatedVectorDrawable) {((AnimatedVectorDrawable) drawable).start();}

点此查看Android开发笔记的完整目录

__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Android开发笔记(一百四十五)仿应用宝的垃圾清理动画相关推荐

  1. Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...

  2. Android开发笔记(六十五)多样的菜单

    菜单Menu Android的菜单分为两类:选项菜单和上下文菜单,默认使用选项菜单.菜单的布局文件存放在res/menu目录下,使用ADT新建一个Android工程,首页代码MainActivity中 ...

  3. Android开发笔记(三十五)页面布局视图

    布局视图的类别 布局视图有五类,分别是线性布局LinearLayout.相对布局RelativeLayout.框架布局FrameLayout.绝对布局AbsoluteLayout.表格布局TableL ...

  4. Android开发笔记(八十五)手机数据库Realm

    Realm应用背景 Android自带的SQLite数据库,在多数场合能够满足我们的需求,但随着app广泛使用,SQLite也暴露了几个不足之处: 1.开发者编码比较麻烦,而且还要求开发者具备SQL语 ...

  5. Android开发笔记(四十五)手势事件

    手势事件的流程 基本手势事件 基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发.返回true表示需要下发给下级视图,返回false表示不需要下发(交 ...

  6. Android开发笔记(二十五)assets目录下的文件读取

    AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...

  7. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  8. Android开发笔记(八十)运行状态检查

    大家都知道刻舟求剑的寓言故事,说的是事物是发展变化着的,如果拘泥于原来的情况,那随着情况的改变,就不会得到预期的结果.同样,影响app运行的因素,并不只是外部环境(如硬件.系统.权限等等),还包括ap ...

  9. Android开发笔记(七十四)布局文件优化

    include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...

最新文章

  1. Mac使用nginx+rtmp服务器
  2. 8家云计算及安全巨头联合成立云安全服务联盟
  3. 上海巨人网络参与网络诈骗整个流程
  4. ubuntu 14.04下spark简易安装
  5. Python: How to Sort a List
  6. 计算机网络标准体系,计算机网络标准体系结构实验报告.doc
  7. java基础知识复习
  8. 哈啰出行赴美递交招股书:2020年营收60亿元 顺风车成新增长极
  9. 面试官:来,说说图片防盗链实现?
  10. 学习之学习--混沌大学商学院--第一课--HHR计划
  11. shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
  12. 百度收录提交 网站快速收录提交方法【附工具】
  13. 为什么逍遥子说,双11已成全球的社会大协同?
  14. 检查并杀死mysql锁死的进程
  15. CSS3选择器及权重
  16. 梅梅之最新设计——改了又改!!~~
  17. Jmeter的Java脚本往Kafka里传数据(SASL认证)——记第一次写JAVA的Jmeter脚本,超详细。
  18. A. Tom Riddle's Diary
  19. 安徽省铜陵市谷歌卫星地图下载
  20. UE4 使用顶点绘制

热门文章

  1. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
  2. [转] 先验概率与后验概率贝叶斯与似然函数
  3. [翻译]高阶Python一学就会
  4. JavaScript逻辑运算符
  5. 第一:Git安装和使用github(超详解)
  6. python转义例题_笨办法学Python记录--习题37 异常,lambda,yield,转义序列
  7. js 清除html页面,如何清除使用JavaScript输入的HTML文件?
  8. gentoo php,gentoo下的use原始配置让我安装php折腾好久。
  9. java web 项目如何获取客户端登录帐号信息(用于SSO或其他)
  10. php min命令,php min函数怎么用 - min