@Override
  public boolean onTouchEvent(MotionEvent event) {
    final int action = event.getActionMasked();
    boolean handled = false;
    switch (action) {
      case MotionEvent.ACTION_POINTER_DOWN:
      case MotionEvent.ACTION_DOWN:
        if (DEBUG) Log.v(TAG, "*** DOWN ***");
        handleDown(event);
        handleMove(event);
        handled = true;
        break;

      case MotionEvent.ACTION_MOVE:
        if (DEBUG) Log.v(TAG, "*** MOVE ***");
        handleMove(event);
        handled = true;
        break;

      case MotionEvent.ACTION_POINTER_UP:
      case MotionEvent.ACTION_UP:
        if (DEBUG) Log.v(TAG, "*** UP ***");
        handleMove(event);
        handleUp(event);
        handled = true;
        break;

      case MotionEvent.ACTION_CANCEL:
        if (DEBUG) Log.v(TAG, "*** CANCEL ***");
        handleMove(event);
        handleCancel(event);
        handled = true;
        break;
    }
    invalidate();
    return handled ? true : super.onTouchEvent(event);
  }