In this chapter we will introduce the handling of user input for the first time.
In order to do this, we will add a few new member variables and one new method to our GameSurface:
private float lastTouchX; private float lastTouchY; private long touchDownTime = 0; private static final int INVALID_POINTER_ID = -1; private int activePointerId = INVALID_POINTER_ID;
and:
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
final int action = motionEvent.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = motionEvent.getX();
final float y = motionEvent.getY();
lastTouchX = x;
lastTouchY = y;
touchDownTime = System.currentTimeMillis();
activePointerId = motionEvent.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = motionEvent
.findPointerIndex(activePointerId);
final float x = motionEvent.getX(pointerIndex);
final float y = motionEvent.getY(pointerIndex);
final float dX = x - lastTouchX;
final float dY = y - lastTouchY;
lastTouchX = x;
lastTouchY = y;
if (dY < -20) {
Log.d("JustRoids", "MotionEvent: Swipe up (Thrust)");
break;
}
if (dX > 20) {
Log.d("JustRoids", "MotionEvent: Swipe right");
break;
}
if (dX < -20) {
Log.d("JustRoids", "MotionEvent: Swipe left");
break;
}
break;
}
case MotionEvent.ACTION_UP: {
if (System.currentTimeMillis() < touchDownTime + 150) {
Log.d("JustRoids", "MotionEvent: Tap (Fire)");
}
activePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
activePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
final int pointerId = motionEvent.getPointerId(pointerIndex);
if (pointerId == activePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
lastTouchX = motionEvent.getX(newPointerIndex);
lastTouchY = motionEvent.getY(newPointerIndex);
activePointerId = motionEvent.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
These changes will not do anything with our ship, yet. They will only detect and print out the different actions we like to capture; swipe left/right/up and tap.
In order to see the debug printout, you will have to select the LogCat tab in the lower section of Eclipse:

Then you can add a filter (the green "plus" symbol in the LogCat window), in order to hide all but the messages we print out from our own app:

Now we have everything in place to run our app again and try a few sweeps and taps on the screen, and see the printouts:

It works! We now have the framework for event handling in place.
In the next chapter, we'll go through how we can use these events to make our ship move.