Tuesday, 7 April 2015

Android Pinch Zoom


In previous article I  explained how to implement share via option.Now I am going to explain android pinch zoom


Step 1).imageView.java


package com.groupchat;
import java.io.File;
import com.docx.R;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.net.Uri;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.ImageView;
import android.widget.Toast


public class ImageView extends Activity 
{
String path;
ImageView i;
private ScaleGestureDetector scaleGestureDetector;
private 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;

// Remember for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
String savedItemClicked;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.imageview);


i = (ImageView) findViewById(R.id.ChatImage);
i.setImageURI("");//Insert your image uri

scaleGestureDetector = new ScaleGestureDetector(this,
new ScaleListener());

}



        @Override
public boolean onTouchEvent(MotionEvent event)
{
   ImageView view = (ImageView)findViewById(R.id.ChatImage);
   dumpEvent(event);

   // Handle touch events here...
   switch (event.getAction() & MotionEvent.ACTION_MASK)
   {
    case  MotionEvent.ACTION_DOWN:
       savedMatrix.set(matrix);
        start .set(event.getX(), event.getY());
     
       mode = DRAG;
       break;
   case MotionEvent.ACTION_POINTER_DOWN:
           oldDist = spacing(event);
 
       if (oldDist > 10f)
       {
            savedMatrix.set(matrix);
           midPoint(mid event);
            mode = ZOOM;
       
       }
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
        mode = NONE;
     
        break;
    case  MotionEvent.ACTION_MOVE:
       if (mode == DRAG) {
           // ...
            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x, event.getY()
                   - start.y);
       } else if (mode == ZOOM)
       {
           float newDist = spacing(event);
     
           if (newDist > 10f)
           {
               matrix.set(savedMatrix);
               float scale = newDist / oldDist;
                matrix.postScale(scale, scalemid .x, mid .y);
           }
       }
        break;
   }

   view.setImageMatrix(matrix);
   return true;

}


      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 & 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 >> MotionEvent.ACTION_POINTER_ID_SHIFT);
       sb.append(")");
   }
   sb.append("[");
   for (int i = 0; i < 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 < event.getPointerCount())
            sb.append(";");
   }
         sb.append("]");

}
     private float spacing(MotionEvent event
{
   float xevent.getX(0) - event.getX(1);
   float yevent.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 class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener 
          {
@Override
public boolean onScale(ScaleGestureDetector detector
{
float scaleFactor detector.getScaleFactor();
scaleFactor = Math.max(0.1f, Math.min(scaleFactor , 5.0f));
matrix.setScale(scaleFactor scaleFactor );
i.setImageMatrix(matrix);
return true;
}
 }
}


Happy Coding :)