@1up, thanks a lot for the solution!
An enhancement I could add is even if the swipe direction is reversed without lifting the finger, it would work well.
Using the skeleton you gave, posting my code hoping it would help somebody in future...
public class OnSwipeListener implements OnTouchListener
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
boolean result = false;
float currentX = 0.0f;
float currentY = 0.0f;
float current_diffX = 0.0f;
float current_diffY = 0.0f;
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
//Touch detected, record base X-Y coordinates
baseX = event.getX();
baseY = event.getY();
//As the event is consumed, return true
result = true;
break;
case MotionEvent.ACTION_MOVE:
//Swipe started, get current X-Y coordinates and compute those with the base ones
currentX = event.getX();
currentY = event.getY();
current_diffX = currentX - baseX;
current_diffY = currentY - baseY;
//...................................................Determine horizontal swipe direction
if(h_swipe == LEFT_SWIPE)
{
if( currentX > previousX )
{
//If here, then horizontal swipe has been reversed
h_swipe = RIGHT_SWIPE;
//Overwrite base coordinate
baseX = previousX;
//Recalculate Difference
current_diffX = currentX - baseX;
}
else
{
//NOP - Intentionally kept empty
}
}
else if(h_swipe == RIGHT_SWIPE)
{
if( currentX < previousX )
{
//If here, then horizontal swipe has been reversed
h_swipe = LEFT_SWIPE;
//Overwrite base coordinate
baseX = previousX;
//Recalculate Difference
current_diffX = currentX - baseX;
}
else
{
//NOP - Intentionally kept empty
}
}
else
{
//If here, then it's a fresh swipe event, so compare with base coordinates
if( currentX < baseX )
{
h_swipe = LEFT_SWIPE;
}
else if( currentX > baseX )
{
h_swipe = RIGHT_SWIPE;
}
else
{
//NOP - Intentionally kept empty
}
}
//...................................................Determine vertical swipe direction
if(v_swipe == UP_SWIPE)
{
if(currentY > previousY)
{
//If here, then vertical swipe has been reversed
v_swipe = DOWN_SWIPE;
//Overwrite base coordinate
baseY = previousY;
//Recalculate coordinate difference
current_diffY = currentY - baseY;
}
else
{
//NOP - Intentionally kept empty
}
}
else if(v_swipe == DOWN_SWIPE)
{
if(currentY < previousY)
{
//If here, then vertical swipe has been reversed
v_swipe = UP_SWIPE;
//Overwrite base coordinate
baseY = previousY;
//Recalculate coordinate difference
current_diffY = currentY - baseY;
}
else
{
//NOP - Intentionally kept empty
}
}
else
{
//If here, then it's a fresh swipe event, so compare with base coordinates
if( currentY < baseY )
{
v_swipe = UP_SWIPE;
}
else if( currentY > baseY )
{
v_swipe = DOWN_SWIPE;
}
else
{
//NOP - Intentionally kept empty
}
}
//Record current coordinates for future comparisons
previousX = currentX;
previousY = currentY;
//................................Determine the prominent swipe (horizontal/vertical)
if(Math.abs(current_diffX) > Math.abs(current_diffY))
{
//It's a horizontal swipe
if (Math.abs(current_diffX) > SWIPE_THRESHOLD)
{
if (current_diffX > 0)
{
onRightSwipe();
}
else
{
onLeftSwipe();
}
}
else
{
//Not enough swipe movement, ignore.
//NOP - Intentionally kept empty
}
}
else
{
//It's a vertical swipe
if (Math.abs(current_diffY) > SWIPE_THRESHOLD)
{
if (current_diffY > 0)
{
onDownSwipe();
}
else
{
onUpSwipe();
}
}
else
{
//Not enough swipe movement, ignore.
//NOP - Intentionally kept empty
}
}
//As the event is consumed, return true
result = true;
break;
case MotionEvent.ACTION_UP:
//Swipe ended, clear variables, if necessary
h_swipe = NO_H_SWIPE;
v_swipe = NO_V_SWIPE;
baseX = 0.0f;
baseY = 0.0f;
previousX = 0.0f;
previousY = 0.0f;
//As the event is consumed, return true
result = true;
break;
default:
//Do not consume event
result = false;
break;
}
return result;
}
public void onUpSwipe()
{
}
public void onDownSwipe()
{
}
public void onRightSwipe()
{
}
public void onLeftSwipe()
{
}
}