Android 属性动画 ObjectAnimator

ObjectAnimator 可以直接对任意对象的任意属性进行动画操作

是的,任意对象,而不单单只是 View 对象

ObjectAnimator 不断地对对象中的某个属性值进行赋值,然后根据对象属性值的改变再来决定如何展现 出来

比如为 TextView 设置如下动画

ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);

上面的代码不断改变 alpha 的值,从 1f - 0f ,然后对象根据属性值的变化来刷新界面显示,从而展现出淡入淡出的效果

但是,我们知道,TextView 并没有 alpha 这个属性

所以,到底是怎么实现的呢?

ObjectAnimator 内部机制是 寻找传输的属性名对应的 getset方法,而非找这个属性值

范例

我们写一个 demo 使用 ObjectAnimator 来实现四种补间动画的效果


  1. 创建一个 空的 Android 项目 cn.twle.android.ObjectAnimator

  2. 修改 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>
    
  3. 修改 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;
            }
        }
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.