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 件のコメント:
コメントを投稿