一手遮天 Android - Animation: 属性动画(Property Animation)中的 ObjectAnimator
示例如下:
/animation/AnimationDemo6.java
/**
* 属性动画(Property Animation)中的 ObjectAnimator
* 1、Animator - 包括 ValueAnimator 和 ObjectAnimator,是动画控制的核心类
* 2、TimeInterpolator - 就是 Interpolator,用于计算不同时间点的动画结果的比例值,默认值是 LinearInterpolator 匀速变化
* 3、TypeEvaluator - 用于根据从 TimeInterpolator 获取到的比例值,计算出对应的实际位置
*
* ObjectAnimator - 用于将对象的某属性的变化动画化,继承自 ValueAnimator(在 xml 定义的各种值控制器均需要放在 res/animator 目录下)
* 因为 ObjectAnimator 继承自 ValueAnimator,这部分仔细看 ValueAnimator 就好,关于 ValueAnimator 请参见 animation/AnimationDemo5.java
* 相对于 ValueAnimator 来说 ObjectAnimator 的 ofInt(), ofFloat(), ofArgb(), ofObject() 方法均多了两个参数
* 第一个参数:用于指定当前 ObjectAnimator 需要绑定到的对象
* 第二个参数:用于指定当前 ObjectAnimator 需要绑定到的属性名称
* 比如某对象有 getAlpha(), setAlpha() 方法,那么这里需要绑定的属性名称就是 alpha,对于自定义控件来说也要遵守这个规范
*
* AnimatorSet - 用于定义一组 ObjectAnimator 动画,支持嵌套,继承自 Animator
* play(Animator anim) - 执行指定 Animator
* play(Animator anim1).before(Animator anim2) - 先执行 anim1 再执行 anim2
* play(Animator anim1).after(Animator anim2) - 先执行 anim2 再执行 anim1
* play(Animator anim1).with(Animator anim2) - 同时执行 anim1 和 anim2
* 以上,在调用 play() 之后就支持无限调用 before(), after(), with() 的链式语法了
* 以上,只是用于设置不同 ObjectAnimator 之间的调用顺序,要启动此 AnimatorSet 的话还是要调用 start() 方法
*
* Animator - 控制器
* 这部分的说明,请参见 animation/AnimationDemo5.java
* setTarget(Object target) - 如果 Animator 是 ObjectAnimator 或 AnimatorSet 的话就通过此方法将 xml 中定义的 ObjectAnimator 或 AnimatorSet 绑定到指定的对象
*
* AnimatorInflater.loadAnimator(Context context, int id) - 获取 xml 中定义的 Animator 对象
*/
package com.webabcd.androiddemo.animation;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.webabcd.androiddemo.R;
import com.webabcd.androiddemo.utils.Helper;
public class AnimationDemo6 extends AppCompatActivity {
private TextView mTextView1;
private TextView mTextView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation_animationdemo6);
mTextView1 = findViewById(R.id.textView1);
mTextView2 = findViewById(R.id.textView2);
sample1();
sample2();
}
private void sample1() {
// 从 xml 中加载 Animator
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.set_animation_animationdemo6);
// 将 Animator 绑定到指定的对象
animator.setTarget(mTextView1);
// 启动动画
animator.start();
}
private void sample2() {
AnimatorSet animatorSet = new AnimatorSet();
/**
* 相对于 ValueAnimator 来说 ObjectAnimator 的 ofInt(), ofFloat(), ofArgb(), ofObject() 方法均多了两个参数
* 第一个参数:用于指定当前 ObjectAnimator 需要绑定到的对象
* 第二个参数:用于指定当前 ObjectAnimator 需要绑定到的属性名称
* 比如某对象有 getAlpha(), setAlpha() 方法,那么这里需要绑定的属性名称就是 alpha,对于自定义控件来说也要遵守这个规范
*/
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mTextView2, "translationX",0f, Helper.dp2px(this, 100));
objectAnimator1.setDuration(1000);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mTextView2, "alpha",1f, 0f, 1f);
objectAnimator2.setDuration(1000);
// 先执行 objectAnimator1 再执行 objectAnimator2
animatorSet.play(objectAnimator1).before(objectAnimator2);
// 启动动画
animatorSet.start();
}
}
/layout/activity_animation_animationdemo6.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="#FFFF0000" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="#FFFF0000" />
</LinearLayout>
/animator/set_animation_animationdemo6.xml
<!--
set - 用于定义一组 ObjectAnimator 动画,支持嵌套,对应 java 中的 AnimatorSet
ordering - 子元素的执行顺序
sequentially - 顺序执行
together - 并行执行
objectAnimator - 用于控制某对象的某属性的变化(具体控制的是哪个对象,需要在 java 中通过 setTarget() 绑定)
propertyName - 需要控制的属性
比如 alpha, translationX, translationY, scaleX, scaleY, rotation, rotationX, rotationY 之类的
startOffset - 动画启动的延迟时间,单位:毫秒
duration - 动画的持续时间,单位:毫秒
valueType - 值的类型 intType, floatType, colorType, pathType
valueFrom - 起始值
valueTo - 结束值
repeatMode - 动画结束后的重复方式
restart - 重头播放(对应 java 中的 ObjectAnimator.RESTART)
reverse - 来回播放(对应 java 中的 ObjectAnimator.REVERSE)
repeatCount - 重复次数(-1 为无限循环)
interpolator - 指定此动画的 Interpolator(关于 Interpolator 参见 animation/AnimationDemo2 和 animation/AnimationDemo3)
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="1000"
android:propertyName="translationX"
android:valueFrom="0dp"
android:valueTo="100dp"
android:valueType="floatType" />
<set android:ordering="together">
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" />
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>
</set>
</set>