Androidアニメーション詳細(プロパティアニメーション、ビューアニメーション、フレームアニメーション)

8504 ワード

Androidアニメーションフレーム
Androidは3つのアニメーションシステムを提供しています。
Property Animation:プロパティアニメーション、3.0導入、比較的に柔軟で、すべてのオブジェクトに作用することができます。
View Animation:ビューアニメーションは、viewオブジェクトにしか使えません。使いやすいです。Drawable Animation:フレームアニメーションは、連続的にDrawable資源をロードすることにより、アニメーション効果を実現します。属性アニメーション(Property Animation)
概要
属性アニメーションは骨太な枠组みで、ほとんどのものをアニメにすることができます。属性アニメーションは、指定された時間内に、オブジェクトの属性値を所与のポリシーに従って時間的に変更することができます。
属性アニメーションを使うには三つのことしかできません。
オブジェクトにアニメーションを適用する属性を指定します。アニメーションの時間を指定します。属性の対象範囲を指定します。属性アニメーションはアニメーションの5つの特徴を定義しています。2.時間補間(Time interpolation):過去の時間に基づいて属性値を計算する方法、すなわち属性値の時間に対する関数関係を定義する方法3.繰り返しの回数と行為(Repeat count and behavior):何回繰り返しても、再生できるなど4.アニメーショングループ:複数のアニメーション効果の組み合わせ、フレームリフレッシュ周波数(Frame refresh delay):デフォルトのフレームリフレッシュ周波数は10 msで、あなたも指定できますが、これはシステムの忙しさとシステムの性能に依存します。
属性アニメーションの動作原理
上の図は属性アニメーションフレームの主要なカテゴリの関係図です。
アニメーションの持続時間、現在の属性値、取得区間などを記録します。TimeInterpolator(時間補間器、時間補間因子が定義されている)、Type Everalator(タイプ推定器、補間係数に基づいて属性値を計算する方法を定義している)を実装しました。具体的な仕事の流れは以下の通りです。
アニメーションが開始された後、まず、Value Animtorは、経過時間に基づいてelaphed fractionを計算します。この値は時間が経つにつれて、0-1の間で値を取ります。0は始まったばかりです。1はを終了します。
elapped fractionを計算した後、Value AnimtorはTimeInterpolatorを呼び出し、interpolated fractionを計算する。
interpolated fractionを計算した後、Value AnimtorはType Everalatorを呼び出し、補間因子、初期値、終了値に基づいて、現在の属性値を計算します。属性アニメーションとビューアニメーションの違い
ビューアニメーションはviewオブジェクトにしか機能しません。同時にviewオブジェクトの一部の属性にしか作用しません。view drawnの位置を変更することができます。Viewの実際の位置を変更することはできません。
対照的に、属性アニメーションはよりロバストで、すべてのオブジェクトの属性を動的に変更することができます。しかし、ビューアニメーションの使用は簡単です。ですから、ビューアニメーションが需要を満たすなら、ビューアニメーションを使うことも考えられます。
APIの概要
属性アニメーション関連のクラスのほとんどはAnimtorとEvaalutorを定義しています。ビューアニメーションはすでにAndroid.view.animationパッケージの下で補間器を定義していますので、属性アニメーションも同じ補間器を使用しています。これらの補間器が需要を満たすことができない場合、自分の補間器をカスタマイズできます。
Value Animerを使う
実用化Value Animatorは通常、工場方法:offoat()、offoat()またはobject()などを通じて、例えば:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f);
animation.setDuration(1000);
animation.start();
アニメーションによる補間を使用する場合は、例えば、アニマタープフォームListenerを設定することにより、
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator updatedAnimation) {
        // You can use the animated value in a property that uses the
        // same type as the animation. In this case, you can use the
        // float value in the translationX property.
        float animatedValue = (float)updatedAnimation.getAnimatedValue();
        textView.setTranslationX(animatedValue);
    }
});
取得した内挿は必要に応じて使用します。
Object Animerを使用します。
Object AnimartはValue Animatorのサブクラスであり、オブジェクトのある属性に直接作用することができ、Value Animationのようにアニメイトを追加する必要はなく、オブジェクトの属性は自動的に更新されます。
Object Animartを実装するには、オブジェクトの属性名を指定する必要があります。
ObjectAnimator animation = ObjectAnimator.ofFloat(textView, "translationX", 100f);
animation.setDuration(1000);
animation.start();
Object Animartが正しく動作するためには、保証が必要です。
アニメーションの役割の属性には対応するセット方法が必要です。ない場合、3つの方法があります。b.包装類を使用する。c.Object Animartを使用します。取得区間の値だけを指定すると、この値は区間のend valueとして扱われます。この場合、属性のget方法で現在の値を初期値として取得しますので、該当するget方法が必要です。getとset方法は同じタイプに作用しなければならない。invalidate()方法を使用すると、画面上でアニメーション効果が見られます。これはビューの属性に依存します。
アニメイトセットを使う
アニメイトセットを使用して、複数のアニメーションを組み合わせて、アニメーションの同時、順番、遅延再生などの効果を実現します。
アニメーション制作
属性アニメーションフレームワークは、アニメーション関連のモニターを受信するための2つの傍受を提供します。
アニメイト.アニメイトListener Value Animation.AnimatoUpdateListener(Value Animtorを使用する場合は、そのモニターを実現する必要があります)Type Everalatorを使う
推定値器の役割は内挿因子,初期値および終了値に基づいて新しい属性値を計算することである。属性アニメーションはデフォルトでサポートされています。floatまたはカラーの属性は、それぞれIntEvaalator、FloatEvaalatorとArgbEvaalatorに対応しています。アニメーションの役割の属性値タイプがAndroidサポートのタイプではない場合、自分で推定値を実現する必要があります。Type Evalutorを継承し、evaluteを実現します。
補間器を使う
補間器の役割は,elased fractionに基づいて補間因子を計算し,補間因子とelapped fractionの間の関数関係を定義することである。異なる補間器は異なる補間因子の計算方法を定義し,従って異なるアニメーション効果を生じる。Androidは、複数の補間器を予め定義しており、日常の開発ニーズを満たすことができます。開発ニーズが満たされないなら、補間器をカスタマイズして実現できます。TimeInterpolatorインターフェースを実現すればいいです。
キーフレームを指定
一つのキーフレームは時間/値ペアであり、アニメーションのある時点での状態を指定するために使用され、各キーフレームは同様に補間器を有し、前のフレームとそのフレームとの間の挙動を制御するために使用される。その使い方は以下の通りです
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
rotationAnim.setDuration(5000ms);
Office()やOffobject()などの方法でキーフレームを実例化し、キーフレームを使ってPropertyValues Holderを定義し、最後にObject Animtorを実例化すればいいです。
ビューに属性アニメーションを使う
ビューのアニメーションは、画面上でのビデオの位置を変更することができますが、ビューの実際の位置を変更することはできません。ビューのプロパティは、実際には変更されていないので、プロパティのアニメーションを使用して、この問題を克服することができます。Viewに属性アニメーションを使うために、3.0からAndroidがviewに新しい属性を追加しました。
translationXとtranslationY:rotation、rotationX、およびrotationY scaleXとscaleY pivotXとpivotY:xとy:アルファView PropertyAnimerは複数の属性アニメーションを並行して実行する方法を提供しています。コードは非常に簡潔で読み取り可能です。
xmlに属性アニメーションを宣言します。
属性アニメーションフレームサポートはXMLで属性アニメーションを定義し、アニメーションの定義とコードを分離し、再利用を実現します。viewアニメーションと区別するために、3.1から、xmlで定義された属性アニメーションをres/animtor/ディレクトリの下に置く。
xml方式で属性を定義するアニメーションは、以下のステップに分けられます。
xmlを使用した属性アニメーションコードにアニメーションを読み込みます。
アニメーションのためのtarget を設定します。
アニメーションを開始しますUI性能への影響
動画には追加の描画作業が必要で、動画関連の作業はランディングpipelineのアニメーション段階に加えられます。Profile GPU Renderingツールを使って、問題点を特定できます。
ビューアニメーション(View Animation)
View Animationシステムは、viewに対して補間アニメーションを実行するためのもので、主にviewの内容に対してサイズ、位置、回転、透明度の一連の変換を行うことによって実現されます。
ビューアニメーションを使用するには、コードの実装またはxml定義を使用して、アニメーションの定義とコードを分離して、ハードコードを回避して、多重化を提供することを推奨します。
例:

    
    
        
        
    

まず一つのxmlを定義して、res/anim/目次に置いて、
このようにコードで使用します。
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
アニメーションを先に読み込んで、アニメーションを再生します。
動画の再生時間を設定してviewに設定することもできます。
注意:動画がどんなに変わっても、viewの境界は変動しません。動画がviewの境界を超えても、変形や裁断はありません。親Viewの境界を超えていない限り、。
フレームアニメーション(Drawable Animation)
フレームアニメーションは、連続してDRawable資源をロードすることによって、アニメーション効果を実現し、まるで映画を上映しているかのようです。Animation Drawableはフレームアニメーションの基礎です。
フレームアニメーションには二つの定義があります。一つはコードにAnimationDrawableを使うこと、もう一つはxmlを使うことです。後者は簡単です。
フレームアニメーションの一般的な使い方は以下の通りです。
`
    
    
    
` 
まず一つのxmlファイルを定義し、res/drawable/ディレクトリに保存して、コードの中に保存します。
AnimationDrawable rocketAnimation;

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
      rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
      rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
    }

    public boolean onTouchEvent(MotionEvent event) {
      if (event.getAction() == MotionEvent.ACTION_DOWN) {
        rocketAnimation.start();
        return true;
      }
      return super.onTouchEvent(event);
}
フレームアニメーションをイメージビューの背景に設定し、Animation Drawableを取得し、最後にアニメーションを開始します。
注意:activityのoncreate()フィードバックでstartメソッドを呼び出すのはやめてください。この時点でアニメーションはまだ完全にatachedからwindowに行っていないので、ユーザー同士の対話が必要でない時にすぐにアニメーションを実行する必要があれば、activityのワンウェイフォースChend()でstartを呼び出すことが考えられます。