2011年3月8日火曜日

アニメーションの開始時と終了時の処理を記述する - Coding processing when animation is started and is ended -

このエントリーをはてなブックマークに追加
アニメーションの開始時や終了時の処理は、AnimationListenerクラスを利用することで実現できます。
The processing when animation is started or is ended can be coded using an animation listener class.



AnimationListenerは次の3つのメソッドが抽象メソッドとして定義されています。引数はいずれもAnimation型です。

onAnimationEnd
アニメーション終了時に呼び出されます。

onAnimationRepeat
アニメーション繰り返し時に呼び出されます。

onAnimationStart
アニメーション開始時に呼び出されます。


プログラム
前回のフリックを実現するでは、右から左へフリックすると、赤丸が右から左へと移動するアニメーションプログラムを紹介しました。今回は、そのアニメーションが開始時したときに赤丸を青丸に変え、終了時に青丸を赤丸に変えるプログラムを作成しました。

/LayoutTest/src/org/example/layout/AnimationView.java
package org.example.layout;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;

public class AnimationView extends View implements AnimationListener{
     private int width;
     private int circleWidth;
     private int circleHeight;
     Paint circlePaint;
     GestureDetector gestureDetector;
     TranslateAnimation translate;

     public AnimationView(Context context) {
          super(context);
          circlePaint = new Paint();
          circlePaint.setColor(0xffff0000);

          gestureDetector = new GestureDetector(context, new GestureDetector.OnGestureListener(){

               public boolean onDown(MotionEvent e) {
                    return false;
               }

               public boolean onFling(MotionEvent e1, MotionEvent e2,
                         float velocityX, float velocityY) {

                    if (velocityX < -300) {
                         startAnimation(translate);
                    }
                    return true;
               }

               public void onLongPress(MotionEvent e) {
               }

               public boolean onScroll(MotionEvent e1, MotionEvent e2,
                         float distanceX, float distanceY) {
                    return false;
               }

               public void onShowPress(MotionEvent e) {
               }

               public boolean onSingleTapUp(MotionEvent e) {
                    return false;
               }
          });
     }

     @Override
     protected void onDraw(Canvas canvas) {
          canvas.drawCircle(circleWidth, circleHeight, 90, circlePaint);
     }

     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
          width = w;
          circleWidth = w / 2;
          circleHeight = h / 2;
          translate = new TranslateAnimation(0, -width, 0, 0);
          translate.setDuration(500);
          translate.setAnimationListener(this);
     }

     @Override
     public boolean onTouchEvent(MotionEvent event) {
          gestureDetector.onTouchEvent(event);
          return true;
     }

     public void onAnimationEnd(Animation arg0) {
          circlePaint.setColor(0xffff0000);
     }

     public void onAnimationRepeat(Animation animation) {
     }

     public void onAnimationStart(Animation animation) {
          circlePaint.setColor(0xff0000ff);
     }
}


実行結果


アニメーションが始まると、丸は青丸になります。アニメーションが終わると、丸は赤丸に戻ります。

0 件のコメント:

コメントを投稿