Android補間プロパティアニメーションProperty Animation

6989 ワード

一、Androidはいくつかのアニメーションタイプを提供しています:ViewAnimation(補間Viewアニメーション)、Drawable Animation(フレームごとのアニメーション)、Property Animation(差分属性アニメーション).ViewAnimationはかなり簡単ですが、簡単なズーム、パン、回転、透明度の基本的なアニメーションしかサポートできず、一定の限界があります.例えば、Viewに色の切り替えアニメーションを望んでいます.3 D回転アニメーションを使用することを望んでいます.アニメーションが停止すると、Viewの位置が現在の位置になります.これらのビューアニメーションはできません.これがProperty Animationの原因です.
二、属性アニメーションシステムは以下のアニメーション特性を定義することができる.
1.Duration:アニメーションの期間を指定します.デフォルトの長さは300ミリ秒です.
2.時間補間(Time interpolation):この値は、現在のアニメーションの実行時間を計算する関数の属性値として指定でき、アニメーションの変化頻度を決定します.
3.繰り返し回数と動作(Repeat count and behavior)
このアトリビュートは、アニメーションの終了時にアニメーションを再再生するかどうか、および繰り返し再生する回数を指定します.また、アニメーションが逆再生できるかどうかを指定することもでき、逆再生が設定されている場合、アニメーションは再生回数に達するまで前から後ろに繰り返し再生されます.
4.アニメーションセット(Animator sets):アニメーションを論理セットに整理し、同時に、または順番に、または再生を遅らせることができます.
5.フレームリフレッシュ遅延(Frame refresh delay):アニメーションフレームのリフレッシュ頻度を指定できます.デフォルトでは10秒ごとにリフレッシュされますが、アプリケーションの最終的なリフレッシュフレームの速度は、システムの繁忙度およびシステムが提供できる下位タイマとの反応速度に依存します.
三、使用
public final class ObjectAnimator extends ValueAnimator

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)

1、使用例:
   ObjectAnimator animator = ObjectAnimator.ofFloat(myTextView, "alpha", 0.0f, 1.0f, 0.0f);
   animator.setDuration(3000);
   animator.start();

同理propertyNameはrotation,translationX,translationY,scaleX,scaleYに設定して対応する機能を実現することができる.
2、xmlリソースファイル形式使用:
res/animatorフォルダの下で、対応するxmlファイルを作成します.
<?xml version="1.0"encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:valueType="floatType"
    android:propertyName="alpha"
    android:duration=" 1000"
    android:repeatCount="-1"
    android:repeatMode="reverse">
</objectAnimator>

コードでは次のように使用されます.
   Animator animator = AnimatorInflater.loadAnimator(this, R.animator.myanimator);
   animator.setTarget(myTextView);
   animator.start();

3、Listener AnimatorListener
    animator.addListener(new AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {           
        }
        @Override
        public void onAnimationRepeat(Animator animation) {           
        }
        @Override
        public void onAnimationEnd(Animator animation) {           
        }
        @Override
        public void onAnimationCancel(Animator animation) {           
        }
    });

このように多くの方法を実装したくない場合は、そのうちの1つ以上の方法を実装したい場合は、AnimatorListener Adapterを使用します.
    animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {           
        }
    });

AnimatorListener Adapterのソースコードを見てみましょう:(pause,reusmeはAnimatorPauseListenerのメソッドです)
public abstract class AnimatorListenerAdapter implements
        Animator.AnimatorListener, Animator.AnimatorPauseListener {
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationPause(Animator animation) {
    }
    @Override
    public void onAnimationResume(Animator animation) {
    }
}

四、アニメーションアニメーションアニメーションの組み合わせ
1.コンビネーションアニメーション機能を実現するには、主にAnimatorSetというクラスを利用する必要がある.このクラスはplay()メソッドを提供し、このメソッドにAnimatorオブジェクト(ValueAnimatorまたはObjectAnimator)を入力とAnimatorSetを返す.Builderの例、AnimatorSet.Builderには、次の4つの方法があります.
after(Animator anim)は、入力されたアニメーションに既存のアニメーションを挿入した後、を実行する.
after(long delay)既存のアニメーションをミリ秒遅延してを実行
before(Animator anim)入力されたアニメーションに既存のアニメーションを挿入する前にを実行する.
with(Animator anim)既存のアニメーションと入力されたアニメーションを同時に実行
2、例:
    ObjectAnimator firstAnimator  = ObjectAnimator.ofFloat(myTextView, "translationX", -500f, 0f);
    ObjectAnimator secondAnimator = ObjectAnimator.ofFloat(myTextView, "rotation", 0f, 360f);
    ObjectAnimator thirdAnimator  = ObjectAnimator.ofFloat(myTextView, "alpha", 1f, 0f, 1f);
    AnimatorSet animSet = new AnimatorSet();
    animSet.play(firstAnimator).with(secondAnimator).after(thirdAnimator);
    animSet.setDuration(5000);
    animSet.start();

3、XMLリソースファイル形式使用:(上記の使用方法と類似)
res/animatorフォルダの下にxmlファイルを作成するには、次の手順に従います.
<?xml version="1.0"encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
 
    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType">
    </objectAnimator>
 
    <set android:ordering="together">
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType">
        </objectAnimator>
 
        <set android:ordering="sequentially">
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType">
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType">
            </objectAnimator>
        </set>
    </set>
    <!-- ordering         :sequentially      ,together       -->
 
</set>

コードで使用:
  Animator animator = AnimatorInflater.loadAnimator(this, R.animator.myset);
  animator.setTarget(myTextView);
  animator.start();

4、propertyValuesHolderを使用して、1つのアニメーションに多様な効果を実現する:
//         
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.3f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.3f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(loadingImg, pvhX, pvhY);
animator.setDuration(DURATION_TIME);