@ 1up, thanks for the solution!
An improvement that I could add, even if the scroll direction is reversed without raising my finger, it will work well.
Using the skeleton you gave by posting my code, hoping this helps someone in the 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 XY 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 XY 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 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 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 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 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() { } }
source share