How To Capture Finger Movement Direction In Android Phone?
Solution 1:
Implement onTouchEvent(), and calculate dx and dy by where the user presses down and lifts up. You can use these values to figure out the direction of the move.
float x1, x2, y1, y2, dx, dy;
String direction;
switch(event.getAction()) {
case(MotionEvent.ACTION_DOWN):
x1 = event.getX();
y1 = event.getY();
break;
case(MotionEvent.ACTION_UP): {
x2 = event.getX();
y2 = event.getY();
dx = x2-x1;
dy = y2-y1;
// Use dx and dy to determine the direction of the moveif(Math.abs(dx) > Math.abs(dy)) {
if(dx>0)
direction = "right";
else
direction = "left";
} else {
if(dy>0)
direction = "down";
else
direction = "up";
}
}
}
Solution 2:
Your best bet would be to deal with the MotionEvent's you get from a View.OnTouchListener() callback. The motion events keep track of how you are currently interacting with the View by its action property.
I would imagine you can calculate which direction someone slides their finger by examining the action property of the MotionEvents and the x/y values of where the motion event took place.
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
oldX= event.getX();
oldY= event.getY();
break;
case MotionEvent.ACTION_MOVE:
int newX = motionEvent.getX();
int newY = motionEvent.getY();
int deltaX = oldX - newX;
int deltaY = oldY - newY;
if(Math.abs(deltaY)>Math.abs(deltaX))
//Motion in Y direction.else// Motion in X direction.break;
}
There are lots of other method available on the MotionEvent object for use as well: http://developer.android.com/reference/android/view/MotionEvent.html
Solution 3:
I think instead of having bunch of variables better to use VelocityTracker
Here is modified example from Developer Android
privatevar mVelocityTracker: VelocityTracker? = nulloverridefunonTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
// Reset the velocity tracker back to its initial state.
mVelocityTracker?.clear()
// If necessary retrieve a new VelocityTracker object to watch the// velocity of a motion.
mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain()
// Add a user's movement to the tracker.
mVelocityTracker?.addMovement(event)
}
MotionEvent.ACTION_MOVE -> {
mVelocityTracker?.run {
val pointerId: Int = event.getPointerId(event.actionIndex)
addMovement(event)
// When you want to determine the velocity, call// computeCurrentVelocity(). Then call getXVelocity()// and getYVelocity() to retrieve the velocity for each pointer ID.
computeCurrentVelocity(1000)
val xVelocity = getXVelocity(pointerId)
val yVelocity = getYVelocity(pointerId)
if (abs(xVelocity) > abs(yVelocity))
if (xVelocity > 0)
// rightelse// left elseif (yVelocity > 0)
// downelse// up
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
// Return a VelocityTracker object back to be re-used by others.
mVelocityTracker?.recycle()
mVelocityTracker = null
}
}
returntrue
}
Post a Comment for "How To Capture Finger Movement Direction In Android Phone?"