Android 30
ObjectAnimator
1)对象创建
创建 ObjectAnimator,只需通过其静态工厂类直接返回一个 ObjectAnimator 对象。
/***
* ObjectAnimator ofFloat(Object target, String propertyName, float... values)
* @param Object target : 要对其属性进行动画处理的对象,这个属性要有set/get方法,
* 其内部会通过Java反射机制来调用set方法修改对象的属性值
* @param String propertyName : 动画属性的名称
* @param float... values : 可变的float类型数组,需要传进去该属性变化的取值范围,如200,即:0-200之间
*/
ObjectAnimator mObjectAnimator = ObjectAnimator.ofFloat(imageView, "translationX", 200);
已经内置的属性有:
translationX、translationY:沿X、Y轴平移
rotation、rotationX、rotationY:围绕 View 的支点进行旋转
PrivotX、PrivotY:控制 View 对象的指点位置,围绕这个支点进行旋转和缩放变换处理。默认该支点位置就是 View 对象的中心点。
alpha:透明度,默认是1(不透明),0为完全透明
x、y:描述 View 对象在其容器中的最终位置。
从代码中可以看出,ObjectAnimator extends ValueAnimator:
public final class ObjectAnimator extends ValueAnimator {
......
}
2)设置属性值
可以在创建 ObjectAnimator 对象时,设置一个值,也可以通过 setFloatValues 方法再次去设置整个值。
mObjectAnimator.setFloatValues(400);
3)动画长度
设置动画的长度。 默认持续时间为 300 毫秒。
mObjectAnimator.setDuration(1000);
4)重复次数
设置动画应该重复多少次。
如果重复计数为 0,则动画永远不会重复。重复次数默认为 0。
ValueAnimator.INFINITE 为 持续重复
mObjectAnimator.setRepeatCount(ValueAnimator.INFINITE);
5)重复模式
定义此动画到达结束时应执行的操作。
仅当重复计数大于 0 或 ValueAnimator.INFINITE 时才应用此设置。
默认为 ValueAnimator.RESTART,即从头开始。
mObjectAnimator.setRepeatMode(ValueAnimator.RESTART);
6)插值器
作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有:
LinearInterpolator:线性插值器,匀速动画
AccelerateDecelerateInterpolator:加速减速插值器,动画两头慢,中间快,默认值
DecelerateInterpolator:减速插值器,动画越来越慢
mObjectAnimator.setInterpolator(new LinearInterpolator()); // 插值器,匀速
7)开始播放动画
mObjectAnimator.start();
8)暂停播放动画
mObjectAnimator.pause();
9)反向播放动画
mObjectAnimator.reverse();
10)监听器
AnimatorUpdateListener,监听整个动画过程,动画是由很多帧组成的,每播放一帧,onAnimationUpdate就会被调用一次。
mObjectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前动画右移的距离,即上方设置的 0-200 区间内的值
float num = (float) animation.getAnimatedValue();
Log.d("AAAAAAAAA", "num: " + num);
}
});
11)获取比例
mObjectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前动画右移的距离,即上方设置的 0-200 区间内的值
float num = (float) animation.getAnimatedValue();
// 比例,为小数 如 0.40100002
float fraction = animation.getAnimatedFraction();
Log.d("AAAAAAAAA", "num: " + num + ", fraction: " + fraction * 100 + "%");
}
});
ValueAnimator
ValueAnimator 不提供任何动画效果,更像一个数值发生器,用来产生有一定规律的数字,从而让调用者控制动画的实现过程。
// 获取循环打印的值
ImageView imageView = findViewById(R.id.test_iv);
ValueAnimator mValueAnimator = ValueAnimator.ofFloat(100, 200);
mValueAnimator.setTarget(imageView);
mValueAnimator.setDuration(1000); // 动画周期,为1s,默认0.3s
mValueAnimator.setRepeatCount(ValueAnimator.INFINITE); // 重复次数,持续重复
mValueAnimator.setRepeatMode(ValueAnimator.RESTART); // 重复模式,从头开始
mValueAnimator.setInterpolator(new LinearInterpolator()); // 插值器,匀速
mValueAnimator.start(); // 开始播放动画
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 即上方设置的 100-200 区间内的值
float num = (float) animation.getAnimatedValue();
// 比例,为小数,如: 0.40100002
float fraction = animation.getAnimatedFraction();
Log.d("AAAAAAAAA", "num: " + num + ", fraction: " + fraction * 100 + "%");
}
});
示例
1)示例 - 平移
<ImageView
android:id="@+id/test_iv"
android:layout_width="300dp"
android:layout_height="300dp"
android:src="@drawable/test1"
/>
----------------------------------------------------------
ImageView imageView = findViewById(R.id.test_iv);
// 创建 ObjectAnimator
ObjectAnimator mObjectAnimator = ObjectAnimator.ofFloat(
imageView,
"translationX", // 平移 translationY
200);
mObjectAnimator.setFloatValues(300);
mObjectAnimator.setDuration(1000); // 动画周期,为1s,默认0.3s
mObjectAnimator.setRepeatCount(ValueAnimator.INFINITE); // 重复次数,持续重复
mObjectAnimator.setRepeatMode(ValueAnimator.RESTART); // 重复模式,从头开始
mObjectAnimator.setInterpolator(new LinearInterpolator()); // 插值器,匀速
mObjectAnimator.start(); // 开始播放动画
mObjectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前动画右移的距离,即上方设置的 0-200 区间内的值
float num = (float) animation.getAnimatedValue();
Log.d("AAAAAAAAA", "num: " + num);
}
});
2)示例 - 旋转
<ImageView
android:id="@+id/test_iv"
android:layout_width="300dp"
android:layout_height="300dp"
android:src="@drawable/test1"
/>
----------------------------------------------------------
ImageView imageView = findViewById(R.id.test_iv);
// 创建 ObjectAnimator
ObjectAnimator mObjectAnimator = ObjectAnimator.ofFloat(
imageView,
"rotation", // 旋转 rotationX、rotationY
360f);
mObjectAnimator.setDuration(1000); // 动画周期,为1s,默认0.3s
mObjectAnimator.setRepeatCount(ValueAnimator.INFINITE); // 重复次数,持续重复
mObjectAnimator.setRepeatMode(ValueAnimator.RESTART); // 重复模式,从头开始
mObjectAnimator.setInterpolator(new LinearInterpolator()); // 插值器,匀速
mObjectAnimator.start(); // 开始播放动画
mObjectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float num = (float) animation.getAnimatedValue();
Log.d("AAAAAAAAA", "num: " + num);
}
});
小鱼的摆尾
使各个部位,摆动的频率不同,实现摆尾的效果;
效果如图:
源码地址:
日进一步!持续学习!