在Android动画介绍——属性动画(1)中我们介绍了单一效果的属性动画的实现,在这里我们继续介绍多种效果叠加的属性动画实现。
多种效果叠加的属性动画实现方法有两种。
1、利用PropertyValuesHolder:可以将多种动画效果同时执行
2、利用AnimatorSet(组合动画):AnimatorSet 不仅可以同时执行多个动画效果,也可以让多个动画效果按照一定的顺序执行。
PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。其中属性包括如下内容:
alpha(透明度动画)
scaleX/scaleY(缩放动画)
translationX/translationY(平移动画)
rotation(旋转动画)
PropertyValuesHolder的常用方法如下:
方法 | 描述 |
---|---|
static PropertValuesHolder ofInt(String propertyName, int... values) | 设置整型属性 |
static PropertValuesHolder ofFloat(String propertyName, float... values) | 设置浮点型属性 |
static PropertValuesHolder ofObject(String propertyName, TypeEvaluator evaluator, Object... values) | 设置Object型属性 |
AnimatorSet的常用方法如下:
方法 | 描述 |
---|---|
static ObjectAnimator ofInt(Object target, String propertyName, int... values) | 设置整型属性 |
static ObjectAnimator offFloat(Object target, String propertyName, float... values) | 设置浮点型属性 |
static ObjectAnimator ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values) | 设置Object型属性 |
static ObjectAnimator ofArgb(Object target, String propertyName, int... values) | 设置RGB型属性 |
xml文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="MissingConstraints"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_animator_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈,我是AnimatorSet"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.439"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.188" />
<TextView
android:id="@+id/tv_property_values"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈,我是PropertyValuesHolder"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.737" />
</androidx.constraintlayout.widget.ConstraintLayout>
Activity文件:
package com.example.animatordomo;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv_property_values = findViewById(R.id.tv_property_values);
PropertyValuesHolder alphaProper = PropertyValuesHolder.ofFloat("alpha",0.5f,1f);
PropertyValuesHolder scaleXProper = PropertyValuesHolder.ofFloat("scaleX",0f,1f);
PropertyValuesHolder scaleYProper = PropertyValuesHolder.ofFloat("scaleY",0f,1f);
PropertyValuesHolder translationXProper = PropertyValuesHolder.ofFloat("translationX",-100,100);
PropertyValuesHolder translationYProper = PropertyValuesHolder.ofFloat("translationY",-100,100);
PropertyValuesHolder rotationProper = PropertyValuesHolder.ofFloat("rotation",0,360);
ValueAnimator animator = ObjectAnimator.ofPropertyValuesHolder(tv_property_values,alphaProper,
scaleXProper,scaleYProper,translationXProper,translationYProper,rotationProper);
animator.setDuration(5000).start();
TextView tv_animator_set = findViewById(R.id.tv_animator_set);
ObjectAnimator rotate = ObjectAnimator.ofFloat(tv_animator_set,"rotation",0f,360f);
ObjectAnimator translationX = ObjectAnimator.ofFloat(tv_animator_set,"translationX",-100,100f);
ObjectAnimator translationY = ObjectAnimator.ofFloat(tv_animator_set,"translationY",-100,100f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(tv_animator_set,"scaleX",0,1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(tv_animator_set,"scaleY",0,1f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(tv_animator_set,"alpha",0f,1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(rotate)
.with(alpha)
.with(scaleY)
.after(scaleX)
.after(500)
.before(translationX)
.before(translationY);
animatorSet.setDuration(2000).start();
}
}
Domo代码: