title: Pinch zoom bounce to particular location in android
body: <p>I have tried the pinch zoom and drag in my app.I am facing two issues.
  1.On first touch the image move to some other position.Drag action works from that changed position.
  2.During zooming the image bounce to particular location and drag action works for particular bound after jumps.This issue occurs occasionally not frequently.
  Here is my code</p>
  
  <pre><code>  public boolean onTouch(View v, MotionEvent event) {
      ImageView view = (ImageView) v;
      view.setScaleType(ImageView.ScaleType.MATRIX);
      float scale;
  
      // Dump touch event to log
      dumpEvent(event);
  
      // Handle touch events here...
      switch (event.getAction() &amp; MotionEvent.ACTION_MASK) {
  
          case MotionEvent.ACTION_DOWN: //first finger down only
             // savedMatrix.set(matrix);
              start.set(event.getX(), event.getY());
              Log.d(TAG, "mode=DRAG" );
              mode = DRAG;
              break;
          case MotionEvent.ACTION_UP: //first finger lifted
          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
  
  
                  matrix.set(savedMatrix);
                  float dx = event.getX() - start.x;
                  float dy = event.getY() - start.y;
                  matrix.postTranslate(dx, dy);
  
                  /*if (view.getLeft() &gt;= -392){
                      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;
                      matrix.postScale(scale, scale, mid.x, mid.y);
                  }
              }
              break;
      }
  
      // Perform the transformation
      view.setImageMatrix(matrix);
  
      return true; // indicate event was handled
  }
  
  private float spacing(MotionEvent event) {
      float x = event.getX(0) - event.getX(1);
      float y = event.getY(0) - event.getY(1);
      return (float)Math.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);
  }
  
  /** 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());
  }
  </code></pre>