/** Show an event in the LogCat view, for debugging */
  private void dumpEvent(WrapMotionEvent event) {
    // ...
    String names[] = {
      "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?"
    };
    StringBuilder sb = new StringBuilder();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    sb.append("event ACTION_").append(names[actionCode]);
    if (actionCode == MotionEvent.ACTION_POINTER_DOWN
        || actionCode == MotionEvent.ACTION_POINTER_UP) {

      sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT);

      sb.append(")");
    }
    sb.append("[");
    for (int i = 0; i < event.getPointerCount(); i++) {
      sb.append("#").append(i);
      sb.append("(pid ").append(event.getPointerId(i));
      sb.append(")=").append((int) event.getX(i));
      sb.append(",").append((int) event.getY(i));
      if (i + 1 < event.getPointerCount()) sb.append(";");
    }
    sb.append("]");
    Log.d(TAG, sb.toString());
  }
 /** Calculate the mid point of the first two fingers */
 private void midPoint(PointF point, WrapMotionEvent event) {
   // ...
   float x = event.getX(0) + event.getX(1);
   float y = event.getY(0) + event.getY(1);
   point.set(x / 2, y / 2);
 }
 /** Determine the space between the first two fingers */
 private float spacing(WrapMotionEvent event) {
   // ...
   float x = event.getX(0) - event.getX(1);
   float y = event.getY(0) - event.getY(1);
   return FloatMath.sqrt(x * x + y * y);
 }
 private PointF midPointF(WrapMotionEvent event) {
   // ...
   float x = event.getX(0) + event.getX(1);
   float y = event.getY(0) + event.getY(1);
   return new PointF(x / 2, y / 2);
 }