Skip to content Skip to sidebar Skip to footer

How To Capture Finger Movement Direction In Android Phone?

I want to capture the finger movement direction on Android touch phone. If a user slides his finger in up/down/left/right direction, I want to capture this direction. How can I fin

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?"