前言
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.
1.添加可视提示,通知我们这个APP中正在发生的事情。比如用户界面发生变化时,有新的内容加载或某些操作变为可用。
2.提供高逼格的外观
概述
视图动画的缺陷:
对象的局限性:仅限于View
只改变了View的视觉效果,而没有改变View的属性
动画效果单一
属性动画的特点:
作用对象:任意对象,甚至没对象也可以
作用方式:改变对象的属性
动画效果:按需自定义,不再局限于上述4种基本变换
具体使用
属性动画的最核心的类
原理:控制 值 的变化,之后 手动 赋值给对象的属性,从而实现动画
ValueAnimator
ValueAnimator.ofInt(int... values) -- 整型数值
ValueAnimator.ofFloat(float... values) -- 浮点型数值
ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values) -- 自定义对象类型
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 300);
valueAnimator.setDuration(2000);
//差值器 动画执行速率
valueAnimator.setInterpolator(new LinearInterpolator());
//动画重复执行次数
valueAnimator.setRepeatCount(1);//执行2次
//动画延时执行时间
valueAnimator.setStartDelay(200);
//重复执行模式 REVERSE RESTART
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
//添加数字变化监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
Log.e("Gao", String.valueOf(value));
LinearLayout.LayoutParams layoutParams = ((LinearLayout.LayoutParams) image.getLayoutParams());
layoutParams.leftMargin = value;
image.setLayoutParams(layoutParams);
}
});
ObjectAnimator
属性 | 作用 | 数值类型 |
---|---|---|
alpha | 透明度 | float |
translationX | X方向的位移 | float |
translationY | Y方向的位移 | float |
scaleX | X方向的缩放倍数 | float |
scaleY | Y方向的缩放倍数 | float |
rotation | 以屏幕方向为轴的旋转度数 | float |
rotationX | 以X轴为轴的旋转度数 | float |
rotationY | 以Y轴为轴的旋转度数 | float |
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(image, "translationX", 0, 300);
objectAnimator.setDuration(2000);
//差值器 动画执行速率
objectAnimator.setInterpolator(new LinearInterpolator());
//动画重复执行次数
objectAnimator.setRepeatCount(1);//执行2次
//动画延时执行时间
objectAnimator.setStartDelay(200);
//重复执行模式 REVERSE RESTART
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
objectAnimator.start();
AnimatorSet
AnimatorSet.play(Animator anim) :播放当前动画
AnimatorSet.after(long delay) :将现有动画延迟x毫秒后执行
AnimatorSet.with(Animator anim) :将现有动画和传入的动画同时执行
AnimatorSet.after(Animator anim) :将现有动画插入到传入的动画之后执行
AnimatorSet.before(Animator anim) : 将现有动画插入到传入的动画之前执行
animatorSet = new AnimatorSet();
animatorSet.setDuration(3000);
animatorSet.setInterpolator(new LinearInterpolator());
ObjectAnimator translationX = ObjectAnimator.ofFloat(image, "translationX", 0, 300);
ObjectAnimator rotation = ObjectAnimator.ofFloat(image, "rotation", 0, 720);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(image, "scaleX", 1, 5);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(image, "scaleY", 1, 5);
ObjectAnimator alpha = ObjectAnimator.ofFloat(image, "alpha", 1, 0);
animatorSet.play(translationX).before(rotation);
animatorSet.play(scaleX).with(scaleY).after(3000).before(alpha);
animatorSet.start();