Android 属性动画 ObjectAnimator
ObjectAnimator
可以直接对任意对象的任意属性进行动画操作
是的,任意对象,而不单单只是 View
对象
ObjectAnimator
不断地对对象中的某个属性值进行赋值,然后根据对象属性值的改变再来决定如何展现
出来
比如为 TextView
设置如下动画
ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);
上面的代码不断改变 alpha
的值,从 1f - 0f
,然后对象根据属性值的变化来刷新界面显示,从而展现出淡入淡出的效果
但是,我们知道,TextView
并没有 alpha
这个属性
所以,到底是怎么实现的呢?
ObjectAnimator
内部机制是 寻找传输的属性名对应的 get
和 set
方法,而非找这个属性值
范例
我们写一个 demo 使用 ObjectAnimator
来实现四种补间动画的效果
-
创建一个 空的 Android 项目
cn.twle.android.ObjectAnimator
-
修改
activity_main.xml
修改布局<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ly_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动画1" /> <Button android:id="@+id/btn_two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动画2" /> <Button android:id="@+id/btn_three" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动画3" /> <Button android:id="@+id/btn_four" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动画4" /> <Button android:id="@+id/btn_five" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动画5" /> <TextView android:id="@+id/ms_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="简单教程,简单编程" /> </LinearLayout>
-
修改
MainActivity.java
package cn.twle.android.objectanimator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_one; private Button btn_two; private Button btn_three; private Button btn_four; private Button btn_five; private LinearLayout ly_root; private TextView ms_text; private int height; private ObjectAnimator animator1; private ObjectAnimator animator2; private ObjectAnimator animator3; private ObjectAnimator animator4; private AnimatorSet animSet; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); initAnimator(); } private void bindViews() { ly_root = (LinearLayout) findViewById(R.id.ly_root); btn_one = (Button) findViewById(R.id.btn_one); btn_two = (Button) findViewById(R.id.btn_two); btn_three = (Button) findViewById(R.id.btn_three); btn_four = (Button) findViewById(R.id.btn_four); btn_five = (Button) findViewById(R.id.btn_five); ms_text = (TextView) findViewById(R.id.ms_text); height = ly_root.getHeight(); btn_one.setOnClickListener(this); btn_two.setOnClickListener(this); btn_three.setOnClickListener(this); btn_four.setOnClickListener(this); btn_five.setOnClickListener(this); } //初始化动画 private void initAnimator() { animator1 = ObjectAnimator.ofFloat(ms_text, "alpha", 1f, 0f, 1f, 0f, 1f); animator2 = ObjectAnimator.ofFloat(ms_text, "rotation", 0f, 360f, 0f); animator3 = ObjectAnimator.ofFloat(ms_text, "scaleX", 2f, 4f, 1f, 0.5f, 1f); animator4 = ObjectAnimator.ofFloat(ms_text, "translationY", height / 8, -100, height / 2); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_one: animator1.setDuration(3000l); animator1.start(); break; case R.id.btn_two: animator2.setDuration(3000l); animator2.start(); break; case R.id.btn_three: animator3.setDuration(3000l); animator3.start(); break; case R.id.btn_four: animator4.setDuration(3000l); animator4.start(); break; case R.id.btn_five: //将前面的动画集合到一起~ animSet = new AnimatorSet(); animSet.play(animator4).with(animator3).with(animator2).after(animator1); animSet.setDuration(5000l); animSet.start(); break; } } }