1. 程式人生 > >屬性動畫(兩種方式)

屬性動畫(兩種方式)

1.程式碼形式

package com.bawei.mymvp.animation;

import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.Toast;

import com.bawei.mymvp.R;

/**
 * ValueAnimator  先改變值,然後 手動賦值 給物件的屬性從而實現動畫;是 間接 對物件屬性進行操作;
 * ObjectAnimator 先改變值,然後 自動賦值 給物件的屬性從而實現動畫;是 直接 對物件屬性進行操作;
 */
public class AnimationActivity extends AppCompatActivity implements View.OnClickListener {
    private View mViewTranslate, mViewProperty, mViewPropertyOther;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        init();
    }

    private void init() {
        mViewTranslate = findViewById(R.id.view_translate);
        mViewProperty = findViewById(R.id.view_property);
        mViewPropertyOther = findViewById(R.id.view_property_other);

        mViewTranslate.setOnClickListener(this);
        mViewProperty.setOnClickListener(this);
        findViewById(R.id.button_translate).setOnClickListener(this);
        findViewById(R.id.button_property).setOnClickListener(this);
        findViewById(R.id.button_property_other).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.view_translate:
                Toast.makeText(this, "click view_translate", Toast.LENGTH_SHORT).show();
                break;
            case R.id.view_property:
                Toast.makeText(this, "click view_property", Toast.LENGTH_SHORT).show();
                break;
            case R.id.button_translate:
                //補間動畫
                TranslateAnimation translateAnimation = new TranslateAnimation(0, 500,
                        1.0f, 1.0f);
                translateAnimation.setFillAfter(true);
                translateAnimation.setDuration(3000);
                mViewTranslate.startAnimation(translateAnimation);
                break;
            case R.id.button_property:
                //屬性動畫
                //第一步 ObjectAnimator 例項
                //例項通過ObjectAnimator.ofFloat得來
                //第一個引數,我想要移動的view
                //第二個引數,我想要執行動畫的名稱
                //第三個引數,起點,每一個節點,按照座標點依次移動
                final ObjectAnimator translationX = ObjectAnimator.ofFloat(mViewProperty, "translationX", 0, 500, 300, 100, 500);
                //持續時間
                translationX.setDuration(3000);
                //重複次數。。。。。
                translationX.setRepeatCount(0);
                //開始動畫
                translationX.start();
                break;
            case R.id.button_property_other:
                //X軸平移
                ObjectAnimator translation_X = ObjectAnimator.ofFloat(mViewPropertyOther, "translationX", 0,500);
                //Y軸平移
                ObjectAnimator translation_Y = ObjectAnimator.ofFloat(mViewPropertyOther, "translationY", 0,50);
                //透明度
                ObjectAnimator alpha = ObjectAnimator.ofFloat(mViewPropertyOther, "alpha", 1f, 0f);
                //X軸縮放
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleX", 1f, 2f);
                //Y軸縮放
                ObjectAnimator scaleY = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleY", 1f, 2f);
                //旋轉
                ObjectAnimator rotation = ObjectAnimator.ofFloat(mViewPropertyOther, "rotation", 1f, 360f);

                //注意:這裡是AnimatorSet
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.setDuration(3000);
                //大家一起來
                animatorSet.playTogether(translation_X, translation_Y, alpha, scaleX, scaleY, rotation);

                animatorSet.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) {

                    }
                });


//                //play的動畫將在after動畫完成後執行
//                animatorSet.play(translation_X).after(translation_Y);
//                //play的動畫將在before動畫之前執行
//                animatorSet.play(translation_X).before(translation_Y);
//                //play的動畫將和with動畫一起執行
//                animatorSet.play(translation_X).with(translation_Y);

                animatorSet.start();



                //通過AnimatorInflater.loadAnimator拿到動畫
//                Animator anim = AnimatorInflater.loadAnimator(this,R.animator.view_animation);
//                //通過setTarget方法將要執行動畫的view放置進去
//                anim.setTarget(mViewPropertyOther);
//                anim.start();
                break;
            default:
                break;
        }
    }
}

2.第二種在res下建立animator資料夾

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <objectAnimator
        android:duration="1000"
        android:propertyName="translationY"
        android:valueFrom="0"
        android:valueTo="500"
        android:valueType="floatType" />

    <set android:ordering="sequentially">
        <objectAnimator
            android:duration="1000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" />

        <set android:ordering="together">
            <objectAnimator
                android:duration="1000"
                android:propertyName="scaleX"
                android:valueFrom="1"
                android:valueTo="5"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="1000"
                android:propertyName="scaleY"
                android:valueFrom="1"
                android:valueTo="5"
                android:valueType="floatType" />
        </set>
    </set>
</set>