title: how to move and zoom image view with in screen boundaries in android
body: <p>hi i need to zoom and move my image  using below code its working well.but here i have some issues.1 when i gave src as background to image view  that time its working,if i gave background using setbackgroundresource() means my imageview zoom and  move actions not working. 2.for imageview if gave background fillparent that time only its working fine for both zoom and move.if gave  set width 100,and hight 100 that time both zoom and move not working..i need to display my imageview with 100/100 dimensions and i need to zoom and move that image with in a screen boundaries..what i have to do any one suggest please...please</p>
  
  <pre><code>  public class MainActivity extends Activity implements OnTouchListener{
  
  private static final String TAG = "Touch";
  
       Matrix matrix = new Matrix();
     Matrix savedMatrix = new Matrix();
  
     static final int NONE = 0;
     static final int DRAG = 1;
      static final int ZOOM = 2;
         int mode = NONE;
  
  PointF start = new PointF();
  PointF mid = new PointF();
       float oldDist = 1f;
       RelativeLayout.LayoutParams rlp3;
      ImageView view;
      RelativeLayout relativemiddlemain;
  
  
       @Override
  public void onCreate(Bundle savedInstanceState) {
  
     super.onCreate(savedInstanceState);
  
     setContentView(R.layout.activity_main);
  
   relativemiddlemain=(RelativeLayout)findViewById(R.id.zoomlayout);
      view = new ImageView(MainActivity.this);
                      view.setId(0);
                      view.setScaleType(ScaleType.MATRIX);
                      view.setOnTouchListener(MainActivity.this);
                      rlp3 = new    RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT);
        //                     rlp3 = new RelativeLayout.LayoutParams(100,100);
                      rlp3.setMargins(0, 0, 0, 0);
            //                  view.setBackgroundResource(R.drawable.ic_launcher);
                        view.setImageResource(R.drawable.ic_launcher);
               relativemiddlemain.addView(view,rlp3);
  
      }
  
   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);
  
           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; /*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
  
  }
  
  
  
  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);
  
  }
  
  
  
  /** 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>