androidの3種類のアニメーションの詳細


Android 3.0(すなわちAPI Level 11)以前はAndroidは2種類のアニメーションのみをサポートしていた:それぞれFrame Animation(フレームごとのアニメーション)とTween Animation(補間アニメーション)であり、3.0以降AndroidはProperty Animation(プロパティアニメーション)と呼ばれる新しいアニメーションシステムをサポートした.
一、Frame Animation:(フレームごとのアニメーション)
これはよく理解されていて、1フレームの再生画像は、人の目の視覚の残留原理を利用して、私たちにアニメーションの感じをもたらします.その原理のGIFのピクチャー、映画の放送の原理は同じです.
1.サブエレメントを使用してすべての再生フレームを定義すれば、フレーム単位のアニメーションを定義するのは簡単です.
(1)android:oneshot設定は1回のみ再生するか
(2)android:drawable各フレームピクチャの設定
(3)android:duration画像間切替間隔の設定
2.AnimationDrawableをImageViewの背景に設定する習慣
android:background=@anim/frame_anim
JavaコードでAnimationDrawableオブジェクトを取得できます
AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();
(注意が必要なのは、AnimationDrawableはデフォルトでは再生されず、start()メソッドを呼び出して再生を開始し、stopは再生を停止する)
3.上のアニメーションファイルはxmlファイルで構成されています.好きな場合はjavaコードにAnimationDrawableオブジェクトを作成し、addFrame(Drawable frame,int duration)でアニメーションにフレームを追加してstart()を追加することもできます.
二、Tween Animation:(補間アニメーション)
補間アニメーションは、開始フレームと終了フレームを指定するだけで、変化中の他のフレームはシステムによって計算され、自分のフレームを定義する必要はありません.
  • Androidでは、4つのサブクラス:AlphaAnimation(透明度アニメーション)、ScaleAnimation(スケールアニメーション)、TranslateAnimation(シフトアニメーション)、RotateAnimation(透明度アニメーション)を含む抽象アニメーションをAnimationで表します.AndroidではjavaでAnimationクラスのオブジェクトを作成できますが、一般的にはアニメーションリソースファイルを使用してアニメーションを定義し、インタフェースと論理を
  • から分離します.
    (1つのsetで複数のアニメーションを同時に定義し、一緒に実行できます.)
  • android:interpolator=@android:anim/linear_interpolatorはアニメーション期間中にどのくらいのフレームを追加する必要があるかを制御し、簡単に言えばアニメーション速度を制御し、一部の場所では「補間」と訳される.Interpolatorにはいくつかの実装クラスがある:LinearInterpolator、AccelerateInterpolator、AccelerateDecelerateInterpolator、AccelerateDecelerateInterpolator、CycleInterpolator、DecelerateInterpolator、具体的には公式API Demoを参照することができる.
  • animファイルを定義したら、AnimationUtilsツールクラスでロードし、ロードに成功したらAnimationを返すことができます.そして、ViewのstartAnimation(animation)からアニメーションを実行することができます.
  • Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
    //             
    anim.setFillAfter(true);
    //      
    anim.setInterpolator(interpolator);
    // view    
    view. startAnimation(anim);

    三、Property Animation:(属性アニメーション)
    属性アニメーションは、Android 3.0で導入されたもので、私たちのオブジェクトの属性を直接変更することができます.前述のTween Animationでは、Viewの描画効果を変更するだけで、Viewの実際のプロパティは変更されません.TweenアニメーションでButtonを左から右に移動すると、移動後のButtonをどのようにクリックしても反応しません.移動前のButtonの位置をクリックすると反応します.Buttonの位置属性木が変化しているからです.Property Animationでは、Viewオブジェクトのプロパティ値を直接変更することができます.これにより、処理作業を少なくし、効率とコードの読み取り性を向上させることができます.
    (1)ValueAnimator:アニメーション時間、開始、終了属性値、対応する時間属性値の算出方法など、Property Animationアニメーションのすべてのコア機能を含む.ValueAnimatorを適用するには2つのステップがあります
    1属性値を計算します.
    2オブジェクトの属性を変更するなど、属性値に応じたアクションを実行します.
    私たちの主なステップは2つ目で、ValueAnimatorを実現する必要があります.onUpdateListenerインタフェースで、このインタフェースには1つの関数onAnimationUpdate()しかなく、Viewオブジェクトのプロパティを変更することはこのインタフェースでdoされます.
    animation.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            //do your work
        }
    });
    

    (2)ObjectAnimator:ValueAnimatorから継承され、オブジェクトとそのオブジェクトのプロパティを指定するには、プロパティ値の計算が完了すると自動的にそのオブジェクトの対応するプロパティに設定され、Property Animationのすべての2ステップが完了します.実際のアプリケーションではObjectAnimatorを使用してオブジェクトの属性を変更するのが一般的ですが、ObjectAnimatorを使用するには一定の制限があります.ObjectAnimatorを使用するには、次の条件を満たす必要があります.
    1.オブジェクトにはsetter関数があるはずです:set(アルパカ命名法)
    2次の例のように、ofFloatのような工場メソッドでは、1番目のパラメータがオブジェクト名、2番目のパラメータが属性名、後のパラメータが可変パラメータであり、values...パラメータが1つの値しか設定されていない場合、目的値と仮定し、属性値の変化範囲は前の値から目的値であり、現在の値を得るために、そのオブジェクトには対応する属性のgetterメソッドが必要である:get
    3 getterメソッドがある場合、値タイプは対応するsetterメソッドのパラメータタイプと一致する必要があります.
    ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f); oa.setDuration(3000); oa.start();
    上記の条件を満たさない場合は、ValueAnimatorを使用してアニメーションを作成するしかありません.
    (3)Animator.AnimatorListener:Animatorのアニメーションリスニングを設定するには、次の4つの方法を書き換える必要があります.
    onAnimationStart() onAnimationEnd() onAnimationRepeat() onAnimationCancel()
    ここではAnimatorListener Adapterも実装できます.彼の利点は、各関数を実装することなく、リスニングしたいイベントを定義するだけで、空の関数体だけを定義できることです.次のようになります.
    anim.addListener(new AnimatorListenerAdapter() { public void on AnimationEnd(Animator animation){ //do your work } });
    (4)AnimationSet:複数のアニメーションを組み合わせて共同作業が可能
    
    AnimatorSet bouncer = new AnimatorSet();
    bouncer.play(anim1).before(anim2);
    bouncer.play(anim2).with(anim3);
    bouncer.play(anim2).with(anim4)
    bouncer.play(anim5).after(amin2);
    animatorSet.start();

    まずanim 1を再生します.同時にanim 2、anim 3、anim 4を再生します.最後にanim 5を再生します.
    (5)TimeInterplator:Tweenのinterpolatorと似ています.いくつかあります
    AccelerateInterpolator加速、開始時低速中間加速
    DecelerateInterpolator減速、開始時に速く減速
    AccelerateDecelerateInterolatorは先に加速して減速し、開始時は遅く、中間加速
    AnticipateInterpolatorは逆方向で、反対方向に1段変えてから再生を加速します
    AnticipateOvershootInterpolatorは逆方向にバウンドし、反対方向に変化してから再生を加速し、目的値を超えてゆっくりと目的値に移動します
    BounceInterpolatorジャンプ、目的値に近づくと値がジャンプします.目的値100のように、後ろの値は85、77、70、80、90100の順になる可能性があります.
    CycleIinterpolatorループ、アニメーションループ一定回数、値の変化は正弦波関数:Math.sin(2 * mCycles * Math.PI * input)
    LinearInterpolator線形、線形均一変化
    OvershottInterpolatorリバウンド、最後に目的値を超えて徐々に目的値に変更
    TimeInterpolatorインタフェースは、interpolatorをカスタマイズすることができます.以上のいくつかはこのインタフェースを実現しています.
    (6)Keyframes:開始と終了以外のキーフレームを定義できます.KeyFrameは抽象クラスで、ofInt()、ofFloat()、ofObject()で適切なKeyFrameを取得し、PropertyValuesHolderを通過します.ofKeyframe PropertyValuesHolderオブジェクトは次のように取得されます.
    Keyframe kf0 = Keyframe.ofInt(0, 400);
    Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
    Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
    Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
    Keyframe kf3 = Keyframe.ofInt(1f, 500);
    PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
    ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);

    上記のコードの意味は、btnオブジェクトのwidth属性値を、開始時にWidth=400、アニメーション開始1/4時にWidth=200、アニメーション開始1/2時にWidth=400、アニメーション開始3/4時にWidth=100、アニメーション終了時にWidth=500とするように設定することです.
    (7)ViewPropertyAnimator:1つのViewに対して複数の属性を同時に変更する場合は、これを推奨します.このクラスでは、マルチプロパティアニメーションが最適化され、リフレッシュビューを減らすためにinvalidate()がいくつかマージされます.しかも使い勝手は非常に簡単ですが、API LEVEL 12、すなわちAndroid 3.1以上が求められます.1行のコードだけで水平、垂直移動が可能
    myView.animate().translationX(50f). translationY(100f);

    (8)常に変更する必要がある属性:
    translationX,translationY:元の位置に対するViewのオフセット
    rotation,rotationX,rotationY:回転,rotationは2 D回転角度に用いられ,3 Dでは後の2つに用いられる
    scaleX,scaleY:スケーリング比
    x,y:Viewの最終座標は、Viewのleft、top位置にtranslationX、translationY
    Alpha:透明度
    四、最後に自分でこの三つのアニメの長所と短所をまとめます.
    (1)Frame Animation(フレームアニメーション)は、主に1フレームの準備された画像を再生するために用いられ、GIF画像のようなものであり、使い勝手がよく、各フレームの画像を事前に準備する必要があるという利点がある.
    (2)Tween Animation(補間アニメーション)は開始と終了のキーフレームを定義するだけで、変化する中間フレームはシステムによって補完され、各フレームを準備する必要がないという利点があり、欠点はオブジェクトの描画のみを変更し、View自体の属性を変更しないことである.そのため、ボタンの位置を変更した場合は、元のボタンの位置をクリックする必要があります.
    (3)Property Animation(アトリビュートアニメーション)は3.0以降に発売されたアニメーションであり、簡単な使用、実現の複雑さの低減、オブジェクトのアトリビュートの直接変更、Viewクラスではなく任意のオブジェクトにほぼ適用できるという利点があり、3.0以上のAPIサポートが必要で制限が大きいという欠点がある.しかし、現在、海外にはオープンソースライブラリがあり、低バージョンのサポートが提供されています.