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