Android - 属性动画ObjectAnimator、ValueAnimator

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);
	}
});

请添加图片描述 请添加图片描述 在这里插入图片描述

小鱼的摆尾

使各个部位,摆动的频率不同,实现摆尾的效果;

效果如图:
在这里插入图片描述

源码地址:

FishDrawable

日进一步!持续学习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android属性动画是一种用于在Android应用程序中创建动画效果的框架。它允许您对任意对象的属性进行动画处理,而不仅仅是视图对象。使用属性动画,您可以平滑地改变对象的属性,如位置、大小、颜色等,从而创建流畅的动画效果。 属性动画的基本概念是通过改变对象的属性值来实现动画效果,而不是通过改变视图的位置或绘制来实现。这使得属性动画比传统的补间动画更加灵活和强大。 要使用属性动画,您需要创建一个Animator对象,并指定要动画化的目标对象和属性。然后,您可以定义动画的持续时间、插值器和监听器等属性。最后,启动动画并观察目标对象的属性值的平滑变化。 以下是一个简单的示例,演示如何使用属性动画来平滑地改变视图对象的透明度: ```java // 创建一个属性动画对象,指定要改变的属性为视图对象的透明度 ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha",***.setDuration(1000); // 设置插值器,控制动画的变化速率 animator.setInterpolator(new AccelerateDecelerateInterpolator()); // 启动动画 animator.start(); ``` 在上面的示例中,我们创建了一个ObjectAnimator对象,指定要改变的属性为视图对象的透明度。然后,我们设置了动*** 除了ObjectAnimatorAndroid还提供了一些其他类型的属性动画,如ValueAnimator和AnimatorSet。这些类可用于更复杂的动画效果,如同时播放多个动画或在动画中修改多个属性。 希望这个简介能帮助您理解Android属性动画的基本概念和用法。如果您有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值