主なアイデア
トゥイーンアニメーションは、アニメーションを実現するために(透明度を変更、翻訳、拡大縮小、回転を含む)コンテンツの表示グラフィック変換のシリーズで完成されます。
具体的には、パターン変換、トリガ時間期間のタイプを指定する命令の事前定義されたセット。これらの命令は、XMLファイルを定義するための方法かもしれない、あなたはまた、ソースコードで定義することができます。タイムラインアニメーションに沿って実行するこれらのプログラム命令を達成することができます。
アニメーションの進行を用いて補間制御は、Androidの補間は、異なる速度プロファイルを達成するLinearInterpolatorとして均一な効果を達成するために、Accelerateinterpolator促進効果を達成するいくつかのサブクラスを提供し、DecelerateInterpolatorは減速効果を達成しました。補間器はまた、自由落下のように、放物線物理学を達成するために、独自のサブクラスを定義することができます。
アニメーションの2つの動作モードがあります。
- 排他モードでは、それは常にアニメーションの最後まで、画面を更新したアニメーションの指示に応じて、ループにプログラムのメインスレッドです。
- 割り込みモード、すなわち単一のスレッドが存在するが、所定時間毎の時間をカウントするメインスレッドは、メインスレッド更新通知画面に通知を送信します。
グラフィック変換はアフィン行列によって達成されます。グラフィック変換は、グラフィックスの基本的な知識です。簡単に言えば、それは、それぞれ変換行列演算であることです。 アンドロイド (BMP、X、Y、Canvas.drawBitmapを呼び出すときに、Canvasクラスは、現在のマトリックスを含み、塗料) 図面、アンドロイドBMPは、第1の行列演算を実行し、計算結果がキャンバス上に表示されます。このように、プログラマは唯一常に画面行列キャンバスを改訂し、更新する必要があり、オブジェクト内のビューは、アニメーションが形成され、グラフィック変換をやり続けるだろう。
分析後アニメーション、補間、形質転換および特定の実施トゥイーンアニメーションの他のタイプ、1つずつ設けられアンドロイド。
Animationクラスとそのサブクラス
アニメーションアニメーションは、クラスや、パン、ズーム、回転、透明度を変更するなどの種々のアニメーション効果を実現するコアモジュールのそのサブクラスです。
トゥイーンアニメーションフレームそれぞれは、ビューの内容補間に基づいてグラフィック変換をしなければならないので、アニメーション行わコア作業は(変換)変換されます。
Aniamtionは、基本クラスで、彼はアニメーションの共通の属性とメソッドを記録しました。その上でアニメーションの再生時間、繰り返し回数、インターポレータとを含む主な属性。アニメーションが最も重要な方法getTransformation(CURRENTTIME、outTransformation)であり、現在の部屋(CURRENTTIME)と補間による方法は、現在の変換、リターンoutTransformationを算出します。
TranslateAnimation、RotateAnimation、AlphaAnimationなどはアルファの値を変更するには、平行移動、回転、アニメーション、などを達成するために、それぞれ、アニメーションのサブクラスです。
親クラスのメソッドをオーバーライドしapplyTransformation各アニメーションは、この方法では、親クラスのgetTransformation法と呼ばれています。また、各アニメーションinitializeメソッド、初期化の完了があります。
異なるアニメーションが異なる特性を有する、このような特性はRotateAnimation角度と終了角度回転点座標を開始している、TranslateAnimationプロパティは、開始位置と終了位置です。AlphaAnimation属性値は初期アルファ値αおよび終了です。
図アニメーションクラスとそのサブクラス次のように:
補間クラスとそのサブクラス
補間は、アニメーションの変化率を規定達成することができ、均一な、正の加速度、負加速度、加速度が不規則になります。
補間器は、アニメーションの変換に適用される乗算器をタイムライン上の点をマッピング唯一の方法、すなわちgetInterpolation(入力フロート)、すべての補間一般的な方法を、カプセル化する基本クラスです。
LinearInerpolatorは、AccelerateInterpolator、DecelerateInterpolator、AccelerateDecelerateInterpolatorは、CycleInterpolator補間器は均一、加速、減速、変速機、循環効果を達成するために、それぞれのサブクラスです。
LinearInterpolatorため、変化率は一定、即ち、F(X)= xです。
- 公共フロート getInterpolation(フロート 入力){
- 戻る 入力を。
- }
AccelerateInterpolatorため、即ち、F(X)= X * Xまたはf(X)= POW(X、2 * mFactor)、徐々に速く、その後、ゆっくりと変化し始めました。
Javaコード
- 公共フロート getInterpolation(フロート 入力){
- もし (mFactor == 1 {.0f)
- リターン (フロート)(入力*入力)。
- } 他 {
- リターン (フロート)Math.pow(入力、 2 * mFactor)。
- }
- }
AccelerateDecelerateInterpolatorために、変化の速度が非常に遅い開始と終了が、中央すぐに、即ち、F(X)=(COS((X + 1)* PI)/ 2.0f)+ 0.5Fです。
- 公共フロート getInterpolation(フロート 入力){
- リターン (フロート)(Math.cos((入力+ 1 )*にMath.PI)/ 2 .0f)+ 0 .5f。
- }
図補間クラスとそのサブクラス次のように:
変換カテゴリ
すべてのトリガアニメーション変換レコードアフィン行列の行列は、元の行列計算を行います、ビットマップ行列乗算のビューが適切な行動(回転、平行移動、拡大縮小、など)で達成することができます。
変換クラスは、マトリックスとアルファ値をカプセル化し、それは第二のmAlphaで、二つの重要なメンバー一mMatrixを有しています。
変換クラス図を以下に示します。
ビューでアニメーション化する方法
論理的には、アニメーションを実現するためには、次の手順を実行する必要があります
- ビューには、画面をリフレッシュ無効呼び出すアニメーションを開始、プロパティをアニメーション化、アニメーションオブジェクトを作成します。
- 無効にする方法は、onDraw機能をトリガ。
- onDraw関数内:
- getTransformation方法は、アニメーション、行列を取得する時間の現在のポイントを呼び出します
- この行列の行列はキャンバスに配置されています
- DrawBitmap方法は、画面を描画し、キャンバスを呼び出します。
- GetTransformationは、戻り値を決定し、trueの場合、invalidateメソッドを呼び出して、次の画面のリフレッシュフレームに行く、それがfalseの場合は、アニメーションが完了したことを示します。
全体のプロセス可能なシーケンス図:
ユースケース
次のコードビューで、システムは、あなたがTranslateAniamtionを定義するビューを作成するときに、メソッドを呼び出すのonCreate開始と運動の終わりを指定し、アニメーションの再生時間の1S、アニメーションに保存された最後のコールstartAnimationとメンバーmCurrentAnianmtion表示されますアニメーションを開始。
あなたはmCurrentAnimationビューでメンバ変数とmTransformationを定義する必要があることに注意してください、現在のアニメーションと変換を記録しました。また、あなたはアニメーションを開始startAnimationメンバ関数を定義する必要があります。
- クラス MYVIEWは 拡張 {表示
- アニメーションmCurrentAnimation = nullを。
- 変換mTransformation = 新しい 変換;
- プライベートボイド setAnimation(アニメーションアニメーション){
- mCurrentAnimation =アニメーション。
- if (animation != null) {
- animation.reset();
- }
- }
- public void startAnimation(Animation animation) {
- animation.setStartTime(animation.START_ON_FIRST_FRAME);
- setAnimation(animation);
- invalidate();
- }
- onDraw (Canvas canvas) {
- long curTime = SystemClock.uptimeMillis ();
- if (mCurrentAniamtion == null){
- canvas.drawBitmap (b, x, y, mPaint);
- }
- else {
- if (!mCurrentAnimation.isInitialized()) //initialize animation
- mCurrentAnimation.initialize (w, h, pw, ph);
- boolean more = mCurrentAnimation.getTransformation (curTime, mTransformation);
- if(more) {
- Matrix m = canvas.getMatrix();
- canvas.setMatrix (mTransformation.getMatrix());
- canvas.drawBitmap (b, x, y, mPaint);
- canvas.setMatrix (m);
- this.invalidate ();
- }
- else {
- mCurrentAnimation = null;
- this.invalidate ();
- }
- }
- }
- void onCreate (){
- Animation anim = new TranslateAnimation (10, 20, 0, 0);
- anim.setDuration (1000); // 1s
- anim.setInterpolator (new AcceleratInterpolator(3.0f));
- startAniamtion(アニメーション)。
- }
- }