title: Android ImageView Scaling and translating issue
body: <p>I’m developing an android application (API 19 4.4) and I encounter some issue with ImageViews.
  I have a SurfaceView, in which I dynamically add ImageViews which I want to react to touch events.
  On so far, I have managed to make the ImageView move and scale smoothly but I have an annoying behavior. </p>
  
  <p>When I scale down the image to a certain limit (I would say half the original size) and I try to move it, the image flicker. 
  After a short analysis, it seems that it’s switching its position symmetrically around the finger point on the screen, cumulating distance, and finally gets out of sight (all that happens very fast ( &lt; 1s).
  I think I am missing something with the relative value of the touch event to the ImageView/SurfaceView, but I’m a quite a noob and I’m stucked…</p>
  
  <p>Here is my code</p>
  
  <pre><code>public class MyImageView extends ImageView {
  private ScaleGestureDetector mScaleDetector ;
  private static final int MAX_SIZE = 1024;
  
  private static final String TAG = "MyImageView";
  PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
  PointF StartPT = new PointF(); // Record Start Position of 'img'
  
  public MyImageView(Context context) {
      super(context);
      mScaleDetector = new ScaleGestureDetector(context,new MySimpleOnScaleGestureListener());
      setBackgroundColor(Color.RED);
      setScaleType(ScaleType.MATRIX);
      setAdjustViewBounds(true);
      RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  
      lp.setMargins(-MAX_SIZE, -MAX_SIZE, -MAX_SIZE, -MAX_SIZE);
      this.setLayoutParams(lp);
      this.setX(MAX_SIZE);
      this.setY(MAX_SIZE);
  
  }
  
  int firstPointerID;
  boolean inScaling=false;
  @Override
  public boolean onTouchEvent(MotionEvent event) {
      // get pointer index from the event object
      int pointerIndex = event.getActionIndex();
      // get pointer ID
      int pointerId = event.getPointerId(pointerIndex);
      //First send event to scale detector to find out, if it's a scale
      boolean res = mScaleDetector.onTouchEvent(event);
  
      if (!mScaleDetector.isInProgress()) {
          int eid = event.getAction();
          switch (eid &amp; MotionEvent.ACTION_MASK)
          {
          case MotionEvent.ACTION_MOVE :
              if(pointerId == firstPointerID) {
  
                  PointF mv = new PointF( (int)(event.getX() - DownPT.x), (int)( event.getY() - DownPT.y));
  
                  this.setX((int)(StartPT.x+mv.x));
                  this.setY((int)(StartPT.y+mv.y));
                  StartPT = new PointF( this.getX(), this.getY() );
  
              }
              break;
          case MotionEvent.ACTION_DOWN : {
              firstPointerID = pointerId;
              DownPT.x = (int) event.getX();
              DownPT.y = (int) event.getY();
              StartPT = new PointF( this.getX(), this.getY() );
              break;
          }
          case MotionEvent.ACTION_POINTER_DOWN: {
              break;
          }
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_POINTER_UP:
          case MotionEvent.ACTION_CANCEL: {
              firstPointerID = -1;
              break;
          }
          default :
              break;
          }
          return true;
      }
      return true;
  
  }
  
  public boolean onScaling(ScaleGestureDetector detector) {
  
      this.setScaleX(this.getScaleX()*detector.getScaleFactor());
      this.setScaleY(this.getScaleY()*detector.getScaleFactor());
      invalidate();
      return true;
  }
  
  private class MySimpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
  
  
      @Override
      public boolean onScale(ScaleGestureDetector detector) {
          return onScaling(detector);
      }
  
      @Override
      public boolean onScaleBegin(ScaleGestureDetector detector) {
          Log.d(TAG, "onScaleBegin");
          return true;
      }
  
      @Override
      public void onScaleEnd(ScaleGestureDetector arg0) {
          Log.d(TAG, "onScaleEnd");
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>I have also another questions about rotations. How should I implement this? 
  Could I use the ScalegestureDetector in some way or have I to make this works in the view touch event? I would like to be able to scale and rotate in the same gesture (and move in another).</p>
  
  <p>Thank for helping me, I would really appreciate!</p>
  
  <p>Sorry for my english</p>