One tap Zoom out on ImageView
<p>I have achieved the pinch-zoom with the help of this code and I have set it to particular level i.e. Scale - 3. I am checking it with identity matrix anyways for the original position.  how to achieve the single tap and zoom out to the original positon. I mean if we tap once out of the bound of the image then it should come back to level ZERO i.e. it should zoom out </p>

<pre><code>public class ImagezoomingActivity extends Activity implements OnTouchListener{
    /** Called when the activity is first created. */

private static final String TAG = "Touch";
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
Matrix savedMatrix2 = new Matrix();
float mx,my;
private static final int WIDTH = 0;
 private static final int HEIGHT = 1;
// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   ImageView view = (ImageView) findViewById(R.id.imageView);


   view.setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
   ImageView view = (ImageView) v;
   // Dump touch event to log
   dumpEvent(event);
   float curX, curY;

   // Handle touch events here...
   switch (event.getAction() &amp; MotionEvent.ACTION_MASK) {
   case MotionEvent.ACTION_DOWN:
      //savedMatrix.set(matrix);
      //start.set(event.getX(), event.getY());
       mx = event.getX();
       my = event.getY();
      Log.d(TAG, "mode=DRAG");
      mode = DRAG;
      break;



   case MotionEvent.ACTION_POINTER_DOWN:
      oldDist = spacing(event);
      Log.d(TAG, "oldDist=" + oldDist);
      if (oldDist &gt; 10f) {
         savedMatrix.set(matrix);
         midPoint(mid, event);
         mode = ZOOM;
         Log.d(TAG, "mode=ZOOM");
      }
      break;

 case MotionEvent.ACTION_UP:

      mode = NONE;
      Log.d(TAG, "mode=NONE");
     // savedMatrix.set(matrix);
     break;


   case MotionEvent.ACTION_MOVE:
/*      if (mode == DRAG) {

          curX = event.getX();
          curY = event.getY();
      //    v.scrollBy((int) (mx - curX), (int) (my - curY));
          mx = curX;
          my = curY;
          break;
      }
      else*/ if (mode == ZOOM) {


         float newDist = spacing(event);
         float arr[]=new float[9];
         Log.d(TAG, "newDist=" + newDist);
         if (newDist &gt; 10f) {
            savedMatrix2.set(matrix);
            matrix.set(savedMatrix);
            float scale = newDist / oldDist;
           // matrix.postScale(scale, scale,mid.x,mid.y);
            matrix.setScale(scale, scale,mid.x,mid.y);
            matrix.getValues(arr);
            // keeping tab on Zooming ...Allowed only to 3.0 level  
            if((arr[Matrix.MSCALE_X]) &gt;3.0){
                matrix.set(savedMatrix2);
            }


         }
      }
      break;
   }

   fixing(v);
   view.setImageMatrix(matrix);
   return true; // indicate event was handled
}





/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent 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 &amp; 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 &gt;&gt; MotionEvent.ACTION_POINTER_ID_SHIFT);
      sb.append(")");
   }
   sb.append("[");
   for (int i = 0; i &lt; 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 &lt; event.getPointerCount())
         sb.append(";");
   }
   sb.append("]");
   Log.d(TAG, sb.toString());
}

/** Determine the space between the first two fingers */
/*private float spacing(MotionEvent event) {
   float x = event.getX(0) - event.getX(1);
   float y = event.getY(0) - event.getY(1);
   return FloatMath.sqrt(x * x + y * y);
}*/

/** Calculate the mid point of the first two fingers */
private void midPoint(PointF point, MotionEvent event) {
   float x = event.getX(0) + event.getX(1);
   float y = event.getY(0) + event.getY(1);
   point.set(x / 2, y / 2);
}

private float spacing(MotionEvent event) {
    if(event.getPointerCount() == 2){
      float x = event.getX(0) - event.getX(1);
      float y = event.getY(0) - event.getY(1);
      return FloatMath.sqrt(x * x + y * y);
    }
    return 0;
  }

    private void fixing(View v) {
        // TODO Auto-generated method stub

        if (SmallerThanIdentity(matrix)) {
            resetView(v);
        }

    }

    public static boolean SmallerThanIdentity(android.graphics.Matrix m) {
        float[] values = new float[9];
        m.getValues(values);
        return ((values[0] &lt; 1.0) || (values[4] &lt; 1.0) || (values[8] &lt; 1.0));
    }

    public void resetView(View v) {
        ImageView view = (ImageView) v;
        matrix = new Matrix();

        view.setScaleType(ImageView.ScaleType.MATRIX);
        view.setImageMatrix(matrix);
    }

}
</code></pre>

<p>Help will be appreciated ... Thanks in advance </p>
