Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
除了动画监听器,动画组合也是各类动画常见的用法,比如把几个补间动画组合起来,就形成了集合动画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开发笔记(一百四十五)仿应用宝的垃圾清理动画相关推荐
- Android开发笔记(七十五)内存泄漏的处理
内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...
- Android开发笔记(六十五)多样的菜单
菜单Menu Android的菜单分为两类:选项菜单和上下文菜单,默认使用选项菜单.菜单的布局文件存放在res/menu目录下,使用ADT新建一个Android工程,首页代码MainActivity中 ...
- Android开发笔记(三十五)页面布局视图
布局视图的类别 布局视图有五类,分别是线性布局LinearLayout.相对布局RelativeLayout.框架布局FrameLayout.绝对布局AbsoluteLayout.表格布局TableL ...
- Android开发笔记(八十五)手机数据库Realm
Realm应用背景 Android自带的SQLite数据库,在多数场合能够满足我们的需求,但随着app广泛使用,SQLite也暴露了几个不足之处: 1.开发者编码比较麻烦,而且还要求开发者具备SQL语 ...
- Android开发笔记(四十五)手势事件
手势事件的流程 基本手势事件 基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发.返回true表示需要下发给下级视图,返回false表示不需要下发(交 ...
- Android开发笔记(二十五)assets目录下的文件读取
AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...
- Android开发笔记(八十九)单例模式
基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...
- Android开发笔记(八十)运行状态检查
大家都知道刻舟求剑的寓言故事,说的是事物是发展变化着的,如果拘泥于原来的情况,那随着情况的改变,就不会得到预期的结果.同样,影响app运行的因素,并不只是外部环境(如硬件.系统.权限等等),还包括ap ...
- Android开发笔记(七十四)布局文件优化
include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...
最新文章
- Mac使用nginx+rtmp服务器
- 8家云计算及安全巨头联合成立云安全服务联盟
- 上海巨人网络参与网络诈骗整个流程
- ubuntu 14.04下spark简易安装
- Python: How to Sort a List
- 计算机网络标准体系,计算机网络标准体系结构实验报告.doc
- java基础知识复习
- 哈啰出行赴美递交招股书:2020年营收60亿元 顺风车成新增长极
- 面试官:来,说说图片防盗链实现?
- 学习之学习--混沌大学商学院--第一课--HHR计划
- shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
- 百度收录提交 网站快速收录提交方法【附工具】
- 为什么逍遥子说,双11已成全球的社会大协同?
- 检查并杀死mysql锁死的进程
- CSS3选择器及权重
- 梅梅之最新设计——改了又改!!~~
- Jmeter的Java脚本往Kafka里传数据(SASL认证)——记第一次写JAVA的Jmeter脚本,超详细。
- A. Tom Riddle's Diary
- 安徽省铜陵市谷歌卫星地图下载
- UE4 使用顶点绘制
热门文章
- Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
- [转] 先验概率与后验概率贝叶斯与似然函数
- [翻译]高阶Python一学就会
- JavaScript逻辑运算符
- 第一:Git安装和使用github(超详解)
- python转义例题_笨办法学Python记录--习题37 异常,lambda,yield,转义序列
- js 清除html页面,如何清除使用JavaScript输入的HTML文件?
- gentoo php,gentoo下的use原始配置让我安装php折腾好久。
- java web 项目如何获取客户端登录帐号信息(用于SSO或其他)
- php min命令,php min函数怎么用 - min