A flick can be easily coded using a GestureDetector.OnGestureListener class.
GestureDetector.OnGestureListenerは次の動作が検出できます。
onDown (タップ)
onFling (タップしてから移動して指が離れるまで)
onLongPress (長時間のタップ)
onScroll (タップしてからの移動)
onShowPress (優しいタッチ)
onSingleTapUp (タップしてすぐに指が離れた)
フリックは、onFlingやonScrollなどを利用すれば実現できそうです。
プログラム
以前に紹介したTranslateAnimationを利用した移動アニメーションでは画面をタッチしたときに移動アニメーションを行うプログラムを作りました。今回は、フリックしたときに移動アニメーションを行うようにAnimationView.javaを変更しました。
フリックの実現にはonFlingを利用しました。onFlingのfloat型の引数velocityXは、タップしてから移動して指が離れるまでのx軸に対する速度(pixels per second)が入っているので、その速度が一定値(-300)を超えたら移動アニメーションを行うようにしました。速度の符号は、デフォルトでは左か右が正、右から左が負のようです。
/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.TranslateAnimation; public class AnimationView extends View{ private int width; private int circleWidth; private int circleHeight; Paint circlePaint; GestureDetector gestureDetector; 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) { TranslateAnimation translate = new TranslateAnimation(0, -width, 0, 0); translate.setDuration(500); 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; } @Override public boolean onTouchEvent(MotionEvent event) { gestureDetector.onTouchEvent(event); return true; } }
実行させたら、なかなかいい具合のフリックができました!
0 件のコメント:
コメントを投稿