前言
动画在我们的日常开发当中经常会使用到,例如,使用视图动画或则属性动画可以实现,加载的loading动画,item的进场动画,及activity和fragment切换时的动画等等
动画的分类
如下图
逐帧动画
1.作用对象
视图控件(View)
- 如Android的TextView、Button等等
- 不可作用于View组件的属性,如:颜色、背景、长度等等
2.原理
按顺序播放一组预先定义好的图片,其实就是将动画拆分成一帧一帧的,每一帧是一张图片
3.具体使用
- 步骤一: 在 res/anim的文件夹里创建动画效果.xml文件
- 步骤2:设置动画资源(图片资源)
- 步骤3:在Java代码中载入 & 启动动画
4.使用场景
较为复杂的动画效果(避免使用的图片较大,造成OOM异常)
补间动画
1.作用对象
视图控件(View)
- 如Android的TextView、Button等等
- 不可作用于View组件的属性,如:颜色、背景、长度等等
2.原理
通过确定开始的视图样式和结束的视图样式,中间的动画由系统补全来确定一个动画
- 结束的视图样式:平移、缩放、旋转 & 透明度样式
- 即补间动画的动画效果就是:平移、缩放、旋转 & 透明度动画
3.分类
如下图
3.具体使用
在xml布局中使用
- 步骤一: 在 res/anim的文件夹里创建动画效果.xml文件
- 步骤2:根据不同动画效果的语法设置不同动画参数,从而实现动画效果
- 步骤3:在Java代码中创建Animation对象并播放动画
示例代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton = (Button) findViewById(R.id.Button);
// 步骤1:创建 需要设置动画的 视图View
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_animation);
// 步骤2:创建 动画对象 并传入设置的动画效果xml文件
mButton.startAnimation(translateAnimation);
// 步骤3:播放动画
}
}
在代码中使用
Button mButton = (Button) findViewById(R.id.Button);
// 步骤1:创建 需要设置动画的 视图View
Animation translateAnimation = new TranslateAnimation(0,500,0,500);
// 步骤2:创建平移动画的对象:平移动画对应的Animation子类为TranslateAnimation
// 参数分别是:
// 1. fromXDelta :视图在水平方向x 移动的起始值
// 2. toXDelta :视图在水平方向x 移动的结束值
// 3. fromYDelta :视图在竖直方向y 移动的起始值
// 4. toYDelta:视图在竖直方向y 移动的结束值
translateAnimation.setDuration(3000);
// 固定属性的设置都是在其属性前加“set”,如setDuration()
mButton.startAnimation(translateAnimation);
// 步骤3:播放动画
4.监听动画
Animation类通过监听动画开始 / 结束 / 重复时刻来进行一系列操作,如跳转页面等等
-
通过在 Java 代码里setAnimationListener()方法设置
Animation.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animation animation) { //动画开始时执行 } @Override public void onAnimationRepeat(Animation animation) { //动画重复时执行 } @Override public void onAnimationCancel()(Animation animation) { //动画取消时执行 } @Override public void onAnimationEnd(Animation animation) { //动画结束时执行 } });
特别注意
若采取上述方法监听动画,每次监听都必须重写4个方法。
- 背景:有些时候我们并不需要监听动画的所有时刻
- 问题:但上述方式是必须需要重写4个时刻的方法,这显示太累赘
- 解决方案:采用动画适配器AnimatorListenerAdapter,解决
- 实现接口繁琐 的问题
anim.addListener(new AnimatorListenerAdapter() {
// 向addListener()方法中传入适配器对象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已经实现好每个接口
// 所以这里不实现全部方法也不会报错
@Override
public void onAnimationStart(Animator animation) {
// 如想只想监听动画开始时刻,就只需要单独重写该方法就可以
}
});
7. 应用场景
7.1 标准的动画效果
- 补间动画常用于视图View的一些标准动画效果:平移、旋转、缩放 & 透明度;
- 除了常规的动画使用,补间动画还有一些特殊的应用场景。
7.2 特殊的应用场景
- Activity 的切换效果
- Fragement 的切换效果
- 视图组(ViewGroup)中子元素的出场效果
特点:补间动画并没有改变View的实际位置,只是视图上面的改变而已
属性动画
1.属性动画出现的原因
- 属性动画是Android3.0(API 11)后才提供的一种全新的动画模式
- 属性动画改变的对象实际位置, 视图动画没有改变实际位置
- 属性动画作用对象是所有Java对象,而视图动画作用对象是视图View
2.作用对象
- 任意 Java 对象
不再局限于视图View
- 实现的动画效果:可自定义各种动画效果
不再局限于4种基本变换:平移、旋转、缩放 & 透明度
3.特点
- 作用对象进行了扩展:不只是View对象,甚至没对象也可以
- 动画效果:不只是4种基本变换,还有其他动画效果
- 作用领域:API11后引入的
工作原理
在一定时间内,通过对值的改变,并不断的将值赋给该对象的属性,从而实现该对象在该属性上的动画效果
4.具体使用
- ValueAnimator 类是先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;
- ObjectAnimator 类是先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接 对对象属性进行操作;
5.插值器和估值器的区别
插值器可以控制属性动画的变化逻辑
估值器可以控制属性动画具体的值的变化
6.属性动画操作类
最后附上一篇学习Android动画的好文章,点击传送门