Android 动画(属性动画基本使用)

it2025-09-28  2

文章目录

一、帧动画二、View 动画(补间动画)三、属性动画(Android 3.0)1. valueAnimator2. ObjectAnimator3. 动画的监听4. 组合动画——AnimatorSet5. 组合动画——PropertyValuesHolder6. 在 XML 中使用属性动画

一、帧动画

将一张张单独的图片连贯的进行播放

二、View 动画(补间动画)

动画效果 alpha(淡入淡出) translate(位移) scale(缩放大小) rotate(旋转)

只能够作用在View上,对于非 View 对象不能使用,例如自定义 View 中的 Point 。

只能实现以上几种动画,没有扩展性。

只能改变 View 的效果,不能改变 View 的属性。

三、属性动画(Android 3.0)

参考:Android属性动画完全解析

在 Animator 框架中使用最多的就是 AnimatorSet 和 ObjectAnimator 配合:使用 ObjectAnimator 进行更精细化的控制,控制一个对象和一个属性值,而使用多个 ObjectAnimator 组合到 AnimatorSet 形成一个动画。

1. valueAnimator

本身不提供任何动画效果,它更像一个数值发生器,用来产生有一定规律的数字。负责计算初始值和结束值之间的动画过渡,管理动画的播放次数、播放模式、对动画设置监听等。 ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); animator.setDuration(300); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float currentValue = (float) animation.getAnimatedValue(); Log.d("TAG", "currentValue:" + currentValue); } }); animator.start(); ValueAnimator animator = ValueAnimator.ofFloat(0f, 5f, 3f, 10f); ValueAnimator animator = ValueAnimator.ofInt(0, 100);

设置延迟

animator.setStartDelay(2000);

循环播放次数

animator.setRepeatCount(3);

循环播放模式

animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatMode(ValueAnimator.REVERSE);

2. ObjectAnimator

直接对任意对象的任意属性进行动画操作。内部通过反射机制调用 set 方法来修改对象的属性值。继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f); objectAnimator.setDuration(3000); objectAnimator.start(); 变化属性 ofFloat(textview, "alpha", 1f, 0f, 1f)//透明度 ofFloat(textview, "rotation", 0f, 360f)//旋转 ofFloat(textview, "rotationX", 0f, 360f)//围绕x轴翻转 ofFloat(textview, "rotationY", 0f, 360f)//围绕y轴翻转 ofFloat(imageView, "translationX", 100f, -500f, 300f)//在x轴平移 ofFloat(imageView, "translationY", 100f, -500f, 300f)//在y轴平移 ofFloat(imageView, "scaleX", 1f, 0.5f, 3f)//横向缩放 ofFloat(imageView, "scaleY", 1f, 0.5f, 3f)//纵向缩放

3. 动画的监听

Animator类当中提供了一个 addListener 方法,ObjectAnimator 继承自 ValueAnimator 的,ValueAnimator 继承自Animator,因此都可以监听。完整的动画具有 start、end、cancel、repeat 四个过程,实现 AnimatorListener。 animator.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) { } }); 只需要实现部分方法 AnimatorListenerAdapter animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { } });

4. 组合动画——AnimatorSet

AnimatorSet 类提供了一个 play() 方法,向这个方法中传入一个 Animator 对象(ValueAnimator 或 ObjectAnimator),将会返回一个 AnimatorSet.Builder 的实例。AnimatorSet.Builder 中包括了 4 个方法 after(Animator anim):将现有动画插入到传入的动画之后执行。 after(long delay):将现有动画延迟指定毫秒后执行。 before(Animator anim):将现有动画插入到传入的动画之前执行。 with(Animator anim):将现有动画和传入的动画同时执行。 ObjectAnimator translationX = ObjectAnimator.ofFloat(imageView, "translationX", -300f, 0f); ObjectAnimator rotation = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f); ObjectAnimator alpha = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f); AnimatorSet animSet = new AnimatorSet(); animSet.play(translationX).with(rotation).after(alpha); animSet.setDuration(3000); animSet.start();

5. 组合动画——PropertyValuesHolder

相比于 AnimatorSet,PropertyValuesHolder 只能是多个动画同时执行。 PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", -300f, 0f); PropertyValuesHolder rotation = PropertyValuesHolder.ofFloat("rotation", 0f, 360f); PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageView, translationX, rotation, alpha); animator.setDuration(3000); animator.start();

6. 在 XML 中使用属性动画

属性动画的 xml 文件都应该存放在 animator 文件夹中。XML文件中我们一共可以使用如下三种标签。 <animator> 对应代码中的 ValueAnimator <objectAnimator> 对应代码中的 ObjectAnimator <set> 对应代码中的 AnimatorSet <animator xmlns:android="http://schemas.android.com/apk/res/android" android:valueFrom="0" android:valueTo="100" android:valueType="intType"/> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:propertyName="alpha"/> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially" > <objectAnimator android:duration="2000" android:propertyName="translationX" android:valueFrom="-500" android:valueTo="0" android:valueType="floatType" > </objectAnimator> <set android:ordering="together" > <objectAnimator android:duration="3000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" android:valueType="floatType" > </objectAnimator> <set android:ordering="sequentially" > <objectAnimator android:duration="1500" android:propertyName="alpha" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" > </objectAnimator> <objectAnimator android:duration="1500" android:propertyName="alpha" android:valueFrom="0" android:valueTo="1" android:valueType="floatType" > </objectAnimator> </set> </set> </set> 加载 xml 文件并启动动画 loadAnimator 加载 xml 文件 setTarget 设置到某一个对象上 start 启动动画 Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file); animator.setTarget(view); animator.start();
最新回复(0)