Android 属性动画(Property Animation) 使用详解

本文详细介绍了Android属性动画的工作原理和使用方法,包括ValueAnimator、ObjectAnimator和AnimatorSet的使用,以及如何通过自定义TypeEvaluator实现复杂动画效果。内容涵盖动画的作用、视图动画的局限性、属性动画的优势、动画组件的工作逻辑,以及各种使用示例和自定义对象动画的实现。
摘要由CSDN通过智能技术生成

谨以文章记录学习历程,如有错误还请指明。

动画综述

Google大大对动画的总述如下:

Animations can add visual cues that notify users about what’s going on in your app. They are especially useful when the UI changes state, such as when new content loads or new actions become available. Animations also add a polished look to your app, which gives it a higher quality look and feel.

没错,放上原文我只是装个逼,~
简单来说,动画就两个作用:

  • 添加可视提示,通知我们这个APP中正在发生的事情。比如用户界面发生变化时,有新的内容加载或某些操作变为可用。
  • 提供高逼格的外观(装逼利器

动画的分类如下:
动画分类

属性动画(Property Animation)

概述

  • 视图动画的缺陷:
    • 对象的局限性:仅限于View
    • 只改变了View的视觉效果,而没有改变View的属性
    • 动画效果单一
  • 属性动画的特点:
    • 作用对象:任意对象,甚至没对象也可以
    • 作用方式:改变对象的属性
    • 动画效果:按需自定义,不再局限于上述4种基本变换
  • 继承关系
    继承关系
Java类名 XML关键字 说明
ValueAnimator <animator> 放置在res/animator/目录下 在一个特定的时间里执行一个动画
TimeAnimator 时序监听回调工具
ObjectAnimator <objectAnimator> 放置在res/animator/目录下 一个对象的一个属性动画
AnimatorSet <set> 放置在res/animator/目录下 动画集合

工作原理

指定时间内,修改属性(对象中对应的字段)的值,以此实现该对象在属性上的动画效果。
为了更好的理解,我们举一个栗子:
图1.linear animation
图1中我们搞出了一个假象的对象,动画作用于这个对象(实际可以说是对象的x属性,也即对象的水平位置),动画持续40ms,移动距离40px。每10ms(默认刷新速率),对象水平移动10px。40ms后,动画结束,物体停止在x=40处。这是一个典型的设置了linearInterpolator(匀速插值器)的动画。

为了更好的了解属性动画的工作原理,下面我们来看一看属性动画的组件是怎么计算上面例子的动画的。
图2.动画计算过程
其逻辑可以总结如下:
1.为 ValueAnimator 设置动画的时长,以及对应属性的始 & 末值
2.设置属性在 始 & 末值 间的变化逻辑

  • TimeInterpolator实现类:插值器-描述动画的变化速率
  • TypeEvaluator实现类:估值器-描述 属性值 变化的具体数值

3.根据2中的逻辑更新当前值
4.获取3中更新的 值 ,修改 目标属性值
5.刷新视图。
6.重复4-5,直到 属性值 == 末值

下面给出动画工作的关键类

Java类 说明
ValueAnimator 动画执行类;核心
ObjectAnimator 动画执行类
TimeInterpolator 时间插值(插值器接口),控制动画变化率
TypeEvaluator 类型估值(估值器接口),设置属性值计算方式,根据属性的 始 & 末值 和 插值 一起计算出当前时间的属性值
AnimatorSet 动画集
AnimatorInflater 加载属性动画的XML文件

一些额外的类

Java类 说明
LayoutTransition 布局动画,为布局的容器设置动画
ViewPropertyAnimator 为View的动画操作提供一种更加便捷的用法
PropertyValuesHolder 保存动画过程中所需要操作的属性和对应的值
Keyframe 控制每个时间段执行的动画距离
AnimationListener
AnimationUpdateListener
AnimatorListenerAdapter
动画事件的监听

具体使用

ValueAnimator

  • 属性动画的最核心的类
  • 原理:控制 值 的变化,之后 手动 赋值给对象的属性,从而实现动画

对于控制的 的不同,Android 提供给我们三种构造方法来实例ValueAnimator对象
1. ValueAnimator.ofInt(int… values) – 整型数值
2. ValueAnimator.ofFloat(float… values) – 浮点型数值
3. ValueAnimator.ofObject(TypeEvaluator evaluator, Object… values) – 自定义对象类型

下面我们一一介绍

ValueAnimator.ofInt()
  • 作用:将初始值 以整型数值的形式 过渡到结束值
  • 估值器:内置IntEvaluator估值器
  • 具体使用:
    操作 值 的方式分为 XML 方式/ Java 代码方式

方式1: Java 方式

推荐 Java 方式,因为某些时候我们需要动态获取属性的起始值,显然XML方式是不支持动态获取的。

//设置动画 始 & 末值
                //ofInt()两个作用:
                //1. 获取实例
                //2. 在传入参数之间平滑过渡
                //如下则0平滑过渡到3
                ValueAnimator animator = ValueAnimator.ofInt(0,3);
                //如下传入多个参数,效果则为0->5,5->3,3->10
                //ValueAnimator animator = ValueAnimator.ofInt(0,5,3,10);

                //设置动画的基础属性
                animator.setDuration(5000);//播放时长
                animator.setStartDelay(300);//延迟播放
                animator.setRepeatCount(0);//重放次数
                animator.setRepeatMode(ValueAnimator.RESTART);
                //重放模式
                //ValueAnimator.START:正序
                //ValueAnimator.REVERSE:倒序

                //设置更新监听
                //值 改变一次,该方法就执行一次
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        //获取改变后的值
                        int currentValue = (int) animation.getAnimatedValue();
                        //输出改变后的值
                        Log.d("1111", "onAnimationUpdate: " + currentValue);

                        //改变后的值发赋值给对象的属性值
                        view.setproperty(currentValue);

                        //刷新视图
                        view.requestLayout();
                    }
                });
                //启动动画
                animator.start();

以上就是一个标准的Java方式的模板

方式2: XML 方式
1.在路径 res/animator/ 路径下常见 XML 文件,如 set_animator.xml
2.在上述文件中设置动画参数

// ValueAnimator采用<animator>  标签
<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:valueFrom="1"
    android:valueTo="0"
    android:valueType="floatType"
    android:repeatCount="1"
    android:repeatMode="reverse"/>
/>

3.Java代码启动动画

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);  
// 载入XML动画

animator.setTarget(view);  
// 设置动画对象

animator.start();  
// 启动动画
ValueAnimator.ofFloat()
  • 作用:将初始值 以浮点型数值的形式 过渡到结束值
  • 估值器:内置FloatEvaluator估值器
  • 具体使用:
    和ValueAnimator.ofInt()及其类似,以下只说明不同之处,省略部分参考 ofInt()

方式1:Java方式

ValueAnimator anim = ValueAnimator.ofFloat(0, 3);  
//只是改了实例方法,除此之外完全一样

方式2:XML方式
只在设置动画 XML 文件中的属性时略有不同

// ValueAnimator 采用 <animator>  标签
// ObjectAnimator 采用 <objectAnimator> 标签
<anima
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值