title: Imageview issue with zoom in and out,drag with maximum and minimum levels
body: <p>I had implemented an image view with the zoom and drag functionalities.I am using matrix for the zoom and drag functionality.But my problem is that I cant set my minimum and maximum zoom level and the drag space limit.can any on e tell me how I can do that.</p>
  
  <pre><code>    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);
      }
  
      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(PointF start,PointF end)
      {
             float x = end.x- start.x;
             float y = end.y -start.y;
  
             return FloatMath.sqrt(x * x + y * y);
      }
  
  @Override
  public boolean onTouch(View v, MotionEvent event) 
  {
         ImageView view = (ImageView) v;
         view.setScaleType(ImageView.ScaleType.MATRIX);
  
         float scale;
  
  
         switch (event.getAction() &amp; MotionEvent.ACTION_MASK) {
  
         case MotionEvent.ACTION_DOWN:
  
              savedMatrix.set(matrix);
              start.set(event.getX(), event.getY());
              Log.d(TAG, "mode=DRAG" );
              mode = DRAG;
  
            break;
         case MotionEvent.ACTION_UP: 
  
             if(mode==DRAG)
             {
                 PointF end=new PointF();
                 end.set(event.getX(), event.getY());
  
                 Log.d("Fling", "Inside the Action Key UP"+spacing(start, end));
  
                 float []x = new float[9],org=new float[9];
  
                 matrix.getValues(x);
                 orgMatrix.getValues(org);
  
                 Log.d("Fling", "matrixValue"+matrix);
                 Log.d("Fling", "OrgmatrixValue"+orgMatrix);
  
                 float matrixSizex=x[Matrix.MSCALE_X];
                 float matrixSizey=x[Matrix.MSCALE_Y];
  
  
                 float matrixOrgSizex=org[Matrix.MSCALE_X];
                 float matrixOrgSizey=org[Matrix.MSCALE_Y];
  
                 if(Math.abs(matrixOrgSizex-matrixSizex)&lt;0.17f&amp;&amp;Math.abs(matrixOrgSizey-matrixSizey)&lt;0.17f)
                 {
                     Log.d("Fling", "Current Size is equal");
                     if(spacing(start, end)&gt;30.f)
                     {
                         if((start.x&gt;end.x+30)&amp;&amp;(Math.abs(start.y-end.y)&lt;50.0f))
                         {
                             Log.d("Fling", "Is From Right To left");
                             loadedimage.setImageMatrix(orgMatrix);
                             leftSwipe();
                             view.setScaleType(ImageView.ScaleType.FIT_XY);
                         }
                         else if((end.x&gt;start.x+30)&amp;&amp;(Math.abs(end.y-start.y)&lt;50.0f))
                         {
                             Log.d("Fling", "Is From Left To Right");                        
                             loadedimage.setImageMatrix(orgMatrix);
                             rightSwipe();
                             view.setScaleType(ImageView.ScaleType.FIT_XY);
                         }
                     }
                 }
             }
         case MotionEvent.ACTION_POINTER_UP: //second finger lifted
            mode = NONE;
            Log.d(TAG, "mode=NONE" );
            break;
         case MotionEvent.ACTION_POINTER_DOWN: //second finger down
            oldDist = spacing(event);
            Log.d(TAG, "oldDist=" + oldDist);
            if (oldDist &gt; 5f) {
               savedMatrix.set(matrix);
               midPoint(mid, event);
               mode = ZOOM;
               Log.d(TAG, "mode=ZOOM" );
            }
            break;
  
         case MotionEvent.ACTION_MOVE: 
            if (mode == DRAG) { 
  
                //movement of first finger
                 PointF end=new PointF();
                 end.set(event.getX(), event.getY());
  
                 Log.d("Fling", "Inside the Action Key UP"+spacing(start, end));
  
                 float []x = new float[9],org=new float[9];
  
                 matrix.getValues(x);
                 orgMatrix.getValues(org);
  
                 Log.d("Fling", "matrixValue"+matrix);
                 Log.d("Fling", "OrgmatrixValue"+orgMatrix);
  
                 float matrixSizex=x[Matrix.MSCALE_X];
                 float matrixSizey=x[Matrix.MSCALE_Y];
  
  
                 float matrixOrgSizex=org[Matrix.MSCALE_X];
                 float matrixOrgSizey=org[Matrix.MSCALE_Y];
  
                 if(Math.abs(matrixOrgSizex-matrixSizex)&gt;=0.17f&amp;&amp;Math.abs(matrixOrgSizey-matrixSizey)&gt;=0.17f)
                 {
  
                     matrix.set(savedMatrix);
  
                     if (view.getLeft() &gt;= 0)
                     {
                         matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
                     }
                 }
            }
            else if (mode == ZOOM) { //pinch zooming
               float newDist = spacing(event);
               Log.d(TAG, "newDist=" + newDist);
               if (newDist &gt; 5f) {
                  matrix.set(savedMatrix);
                  scale = newDist / oldDist; //thinking i need to play around with this value to limit it**
                  matrix.postScale(scale, scale, mid.x, mid.y);
               }
            }
            break;
         }
  
         // Perform the transformation
         view.setImageMatrix(matrix);
  
         return true; // indicate event was handled
  }
  </code></pre>
  
  <p>My Sample code is here can any one help me in setting minimum and maximum zoom and drag level.I also have problem when I touch in the image view it automatically get zoomed when converted to the matrix I cant make it stay fit in the device screen.I am totally stuck here........</p>