Android Animator(动画)类 详解
Android Animator动画类 详解
- 动画分为3种
- ValueAnimator类
- ObjectAnimator类
- AnimatorSet类
- Animator的addListener()方法(监听器)
- 适配器AnimatorListenerAdapter
- 使用XML编写动画
- TimeInterpolator(时间补间器)接口
- ViewPropertyAnimator的用法
动画分为3种
- 逐帧动画(frame-by-frame animation) 类似于动画片的工作原理
- 补间动画(tweened animation) 对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种;补间动画是只能够作用在View上
- 属性动画(property animation) 一种不断地对值进行操作,并将值赋值到指定对象的指定属性上,是任意对象的任意属性
ValueAnimator类
对值进行了一个平滑的动画过渡;我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果
方法 | 使用 |
---|---|
ofFloat(float… values) 构建ValueAnimator的实例,方法当中允许传入多个float类型的参数 |
例:将一个值从0平滑过渡到1或 从0过渡到5,再过渡到3,再过渡到10 ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f); |
ofInt(int… values) 构建ValueAnimator的实例,方法当中允许传入多个Int类型的参数 |
例:将一个值从0平滑过渡到1或 从0过渡到5,再过渡到3,再过渡到10 ValueAnimator anim = ValueAnimator.ofInt(0, 1); ValueAnimator anim = ValueAnimator.ofInt(0, 5, 3, 10); |
ofObject(TypeEvaluator evaluator, Object… values) 构建ValueAnimator的实例,用于对任意对象进行动画操作 |
evaluator:数值具体变化过程的当前数值,是一个自定义的 Evaluator values:指定动画变化区间,类比参考ofInt()、ofFloat() 例: 1. 先定义个Point类 public class Point { private float x; private float y; public Point(float x, float y){ this.x = x; this.y = y; } public float getX() { return x; } public float getY(){ return y; } } 2. 再定义PointEvaluator 类实现TypeEvaluator的接口再使用 public class PointEvaluator implements TypeEvaluator { @Override public Character evaluate(float fraction, Character startValue, Character endValue) { //将startValue和endValue强转成Point对象 Point start = (Point) startValue; Point end = (Point) endValue; //当前值 = 初始值 + fraction * (结束值 - 初始值) float x = start.getX() + fraction * (end.getX() - start.getX()); float y = start.getY() + fraction * (end.getY() - start.getY()); //组装一个新的Point对象当中并返回 Point point = new Point(x,y); return point; } } 3. 使用 Point point1 = new Point(0, 0); Point point2 = new Point(300, 300); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2); |
setDuration() 设置动画运行的时长,单位毫秒 |
例:设置动画时长600毫秒 anim.setDuration(600); |
start() 启动动画 |
例:anim.start(); |
setStartDelay() 设置动画延迟播放的时间,单位毫秒 |
|
setRepeatCount() 设置动画循环播放的次数 |
|
setRepeatMode() 设置动画循环播放的模式 |
2种模式如下: 1.RESTART重新播放 2.REVERSE倒序播放 |
ValueAnimator类工作流程如下
ofInt(0, 100)--------------------------->加速器--------------------------->Evaluator--------------------------->监听器返回
动画运行的值区间 当前值区间的值 计算当前进度的数值 在AnimatorUpdateListener中返回
ObjectAnimator类
可以对任意对象的任意属性进行动画操作;ObjectAnimator类是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的.ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法
构造方法如下:
public static ObjectAnimator ofFloat(Object target, String propertyName, float… values)
public static ObjectAnimator ofInt(Object target, String propertyName, float… values)
target: 指定执行动画的控件
propertyName: 指定控件的属性
values: 可变长参数
例:
//透明度动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);
animator.setDuration(2000);
animator.start(); //旋转动画:围绕x轴旋转
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationX",0,270,0);
animator.setDuration(2000);
animator.start();//旋转动画:围绕y轴旋转
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationY",0,180,0);
animator.setDuration(2000);
animator.start();//旋转动画:围绕z轴旋转
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotation",0,270,0);
animator.setDuration(2000);
animator.start(); //平移动画:在x轴上平移
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationX", 0, 200, -200,0);
animator.setDuration(2000);
animator.start(); //平移动画:在y轴上平移
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationY", 0, 200, -100,0);
animator.setDuration(2000);
animator.start(); //缩放动画:在x轴缩放
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleX", 0, 3, 1);
animator.setDuration(2000);
animator.start();//缩放动画:在y轴上缩放
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleY", 0, 3, 1);
animator.setDuration(2000);
animator.start();
ObjectAnimator类工作流程如下
ofFloat(tv, “scaleX”, 0, 3, 1)--------------------------->加速器--------------------------->Evaluator--------------------------->调用set函数
定义动画对象和区间 当前值区间的值 计算当前进度的数值 使用set函数完成动画
AnimatorSet类
实现组合动画功能
方法 | 使用 |
---|---|
play(Animator anim) 返回一个AnimatorSet.Builder的实例能够控制动画的执行顺序和相互之间的依赖。 |
例: 同下 |
after(Animator anim) 将现有动画插入到传入的动画之后执行 |
例: ObjectAnimator objectAnimator1 = ObjectAnimator.ofArgb(mTextView, “backgroundColor”, Color.WHITE, Color.GREEN); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView, “scaleX”, 0.1f, 1.2f); ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mTextView, “scaleY”, 0.5f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(objectAnimator1).after(objectAnimator2); animatorSet.setDuration(3000); animatorSet.start(); |
after(long delay) 将现有动画延迟指定毫秒后执行 |
例: ObjectAnimator objectAnimator1 = ObjectAnimator.ofArgb(mTextView, “backgroundColor”, Color.WHITE, Color.GREEN); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView, “scaleX”, 0.1f, 1.2f); ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mTextView, “scaleY”, 0.5f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(objectAnimator1).after(objectAnimator2).after(10000); animatorSet.setDuration(3000); animatorSet.start(); |
before(Animator anim) 将现有动画插入到传入的动画之前执行 |
例: ObjectAnimator objectAnimator1 = ObjectAnimator.ofArgb(mTextView, “backgroundColor”, Color.WHITE, Color.GREEN); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView, “scaleX”, 0.1f, 1.2f); ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mTextView, “scaleY”, 0.5f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(objectAnimator1).before(objectAnimator2); animatorSet.setDuration(3000); animatorSet.start(); |
with(Animator anim) 将现有动画和传入的动画同时执行 |
例: ObjectAnimator objectAnimator1 = ObjectAnimator.ofArgb(mTextView, “backgroundColor”, Color.WHITE, Color.GREEN); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView, “scaleX”, 0.1f, 1.2f); ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mTextView, “scaleY”, 0.5f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(objectAnimator1).with(objectAnimator7).with(objectAnimator11); animatorSet.setDuration(3000); animatorSet.start(); |
Animator的addListener()方法(监听器)
Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,AnimatorSet也是继承自Animator的;因此都是可以使用addListener()这个方法的
例:添加一个监听器的代码如下所示:
anim.addListener(new AnimatorListener() {@Override
// onAnimationStart()方法会在动画开始的时候调用public void onAnimationStart(Animator animation) {}@Override
// onAnimationRepeat()方法会在动画重复执行的时候调用public void onAnimationRepeat(Animator animation) {}@Override
// onAnimationEnd()方法会在动画结束的时候调用public void onAnimationEnd(Animator animation) {}@Override
// onAnimationCancel()方法会在动画被取消的时候调用public void onAnimationCancel(Animator animation) {}
});
适配器AnimatorListenerAdapter
使用这个类就可以解决掉实现接口繁琐的问题了;向addListener()方法中传入这个适配器对象,由于AnimatorListenerAdapter中已经将每个接口都实现好了,所以只需要单独重写这一个方法就可以了
例:
anim.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {}
}
使用XML编写动画
通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。具体做法是在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中
XML标签与代码的对照表:
XML标签 | 程序代码 |
---|---|
animator | ValueAnimator |
objectAnimator | ObjectAnimator |
set | AnimatorSet |
例:实现一个从0到100平滑过渡的动画,在XML当中就可以这样写:
<animator xmlns:android="http://schemas.android.com/apk/res/android"android:valueFrom="0"android:valueTo="100"android:valueType="intType"/>
例:如果我们想将一个视图的alpha属性从1变成0,就可以这样写:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:valueFrom="1"android:valueTo="0"android:valueType="floatType"android:propertyName="alpha"/>
例:将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially" ><objectAnimatorandroid:duration="2000"android:propertyName="translationX"android:valueFrom="-500"android:valueTo="0"android:valueType="floatType" ></objectAnimator><set android:ordering="together" ><objectAnimatorandroid:duration="3000"android:propertyName="rotation"android:valueFrom="0"android:valueTo="360"android:valueType="floatType" ></objectAnimator><set android:ordering="sequentially" ><objectAnimatorandroid:duration="1500"android:propertyName="alpha"android:valueFrom="1"android:valueTo="0"android:valueType="floatType" ></objectAnimator><objectAnimatorandroid:duration="1500"android:propertyName="alpha"android:valueFrom="0"android:valueTo="1"android:valueType="floatType" ></objectAnimator></set></set>
</set>
加载XML动画
1. 调用AnimatorInflater的loadAnimator将XML动画文件加载
2. 调用setTarget()方法将这个动画设置到某一个对象上
3. 调用start()方法启动动画
例:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
TimeInterpolator(时间补间器)接口
自带TimeInterpolator
TimeInterpolator接口已经有非常多的实现类了,这些都是Android系统内置好的并且我们可以直接使用的Interpolator。每个Interpolator都有它各自的实现效果
取值 | 说明 |
---|---|
AccelerateDecelerateInterpolator | 先加速后减速效果的Interpolator(默认) |
AccelerateInterpolator | 加速运动效果的Interpolator |
AnticipateInterpolator | 预计效果的Interpolator |
AnticipateOvershootInterpolator | 预测过度的Interpolator |
BounceInterpolator | 反弹效果的Interpolator |
CycleInterpolator | 循环效果的Interpolator |
DecelerateInterpolator | 减速运动效果的Interpolator |
LinearInterpolator | 线性效果的Interpolator |
OvershootInterpolator | 过度效果的Interpolator |
PathInterpolator | 路径效果的Interpolator |
系统中TimeInterpolator的接口定义如下:
public interface TimeInterpolator {float getInterpolation(float input);
}
自定义TimeInterpolator
getInterpolation()方法中接收一个input参数,这个参数的值会随着动画的运行而不断变化,不过它的变化是非常有规律的,就是根据设定的动画时长匀速增加,变化范围是0到1。也就是说当动画一开始的时候input的值是0,到动画结束的时候input的值是1,而中间的值则是随着动画运行的时长在0到1之间变化的。input的值决定了fraction的值。input的值是由系统经过计算后传入到getInterpolation()方法中的,然后我们可以自己实现getInterpolation()方法中的算法,根据input的值来计算出一个返回值,而这个返回值就是fraction
例:自定义TimeInterpolator的使用
public class PointEvaluator implements TypeEvaluator { // 实现TypeEvaluator接口@Overridepublic Object evaluate(float fraction, Object startValue, Object endValue) { //重写了evaluate()方法//将startValue和endValue强转成Point对象Point startPoint = (Point) startValue; Point endPoint = (Point) endValue;
//根据fraction来计算当前动画的x和y的值float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());//组装到一个新的Point对象当中并返回Point point = new Point(x, y);return point;}
}
public class DecelerateAccelerateInterpolator implements TimeInterpolator{ //实现TimeInterpolator接口@Overridepublic float getInterpolation(float input) { //getInterpolation()方法中的逻辑算法实现float result;if (input <= 0.5) {result = (float) (Math.sin(Math.PI * input)) / 2;} else {result = (float) (2 - Math.sin(Math.PI * input)) / 2;}return result;}
}
代码中使用
private void startAnimation() {Point startPoint = new Point(getWidth() / 2, RADIUS);Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {currentPoint = (Point) animation.getAnimatedValue();invalidate();}});anim.setInterpolator(new DecelerateAccelerateInterpolator()); //使用定义的DecelerateAccelerateInterpolator类anim.setDuration(3000);anim.start();
}
ViewPropertyAnimator的用法
TimeInterpolator为View的动画操作提供一种更加便捷的人性化用法,便于更加容易理解
animate()方法:是在Android 3.1系统上新增的一个方法,这个方法的返回值是一个ViewPropertyAnimator对象,也就是说拿到
这个对象之后我们就可以调用它的各种方法来实现动画效果了;ViewPropertyAnimator是支持连缀用法的,将所
有想要组合的动画通过这种连缀的式拼接起来,这样全部动画就都会一起被执行;
等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认
机制的话,我们也可以显式地调用start()方法来启动动画
例:TextView从常规状态变成透明状态
textview.animate().alpha(0f);
//之前是这样的
// ObjectAnimator animator = ObjectAnimator.ofFloat(textview, “alpha”, 0f);
//animator.start();
例:textview运动到500,500这个坐标点上
textview.animate().x(500).y(500);
例:textview运动到500,500这个坐标点上,运行5秒钟
textview.animate().x(500).y(500).setDuration(5000);
例:textview运动到500,500这个坐标点上,运行5秒钟并使用补间器
textview.animate().x(500).y(500).setDuration(5000).setInterpolator(new BounceInterpolator());
Android Animator(动画)类 详解相关推荐
- Android 吸入动画效果详解(仿mac退出效果)
转载自:http://m.blog.csdn.net/blog/leehong2005/9127095 [转]Android 吸入动画效果详解 1,背景 吸入(Inhale)效果,最初我是在iOS上面 ...
- Android的Window类详解
Android的Window类(一) Android的GUI层并不复杂.它的复杂度类似于WGUI这类基于布局和对话框的GUI,与MFC.Qt等大型框架没有可比性,甚至飞漫魏永明的MiniGUI都比它复 ...
- Android Animations动画使用详解
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...
- android 弹性动画,SpringAnimation详解-Android
SpringAnimation 类是最近(25.3.0版本)才添加在支持库中的一个类,它主要是为了让实现弹性动画变得更加方便,其实facebook在很久以前的Rebound库就实现了这样的动画,而且效 ...
- Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】
目 录 推荐网址 抠图片上的某一角下来 8.2.2 Bitmap引起的OOM问题 8.3.1 三个绘图工具类详解 画线条 8.3.16 Canvas API详解(Part 1) 1.transla ...
- Android 动画框架详解,第 1 部分
2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...
- ANDROID L——Material Design详解(动画篇)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
- Android基础入门教程——8.3.1 三个绘图工具类详解
Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...
- Android 动画框架详解
Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...
最新文章
- 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
- 全球黑客盛会:2008年黑帽大会要闻摘要(2)
- 爬虫利器 puppeteer
- GRE核心词汇助记与精练-List11弯、折、扭
- Timus 1018 树形DP
- xlwt+xlrd配合使用修改excel表格
- 四十三 常用内建模块 base64
- HTTP协议详解(文档)
- groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能
- 通过图灵测试!Google掌舵人说“打电话AI”是一次非凡突破
- AxureShare太慢,自己搭建产品原型分享系统
- 魅族手机usb计算机连接文件夹,手机连接电脑传输文件(手机usb连接电脑只充电)...
- Opengl ES Glew库 ----- By YDD的铁皮锅
- python 计算置信区间,Python求解正态分布置信区间
- 使用HLS协议连接nginx实现近实时流方式播放视频
- node生成唯一设备id(node-machine-id)
- 详细剖析二进制文件的读写
- Windows 无法连接到打印机.打印后台程序服务没有运行
- 地图开发技术报告(百度地图)
- STM32串口中断接收实验
热门文章
- 原生JS实现翻书特效
- 主定理与主方法:一类递归式的紧确界分析
- PCM格式及音频采样原理、转换
- 运行MySQL报错:找不到命令mysql、ERROR 2003 (HY000)、ERROR 1045 (28000)
- python gps utc_python UTC,时间戳,字符串转换
- inherits在java中是什么属性_inherits属性
- 大学生都四面成功拿到字节跳动Offer了,你还在摸鱼嘛?
- java学生管理系统(增删改查存)
- 为 GPU 而来,焱融科技推出新一代全闪分布式文件存储产品
- SQL数据类型datetime