Android Pinch and Zoom Image in Activity

Mam ListView z zestawem obrazów. Po kliknięciu któregokolwiek z nich kliknięty obraz pojawi się na nowym działaniu, a pośrodku aktywności w ImageView, również na Zoomable. Problem polega na tym, że powiększam obraz, który zyskuje Zoom, ale także ruchy, takie jak przeciąganie i upuszczanie. Powinienem wyeliminować ten ruch obrazu i powinien być powiększany tylko ze środka aktywności.

ZoomInZoomOutActivity.java

public class ZoomInZoomOutActivity extends Activity implements OnTouchListener 
{
    private static final String TAG = "Touch";
    @SuppressWarnings("unused")
    private static final float MIN_ZOOM = 1f,MAX_ZOOM = 1f;

    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;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.imagedisp);

        Bundle extras = getIntent().getExtras();

        long id =extras.getLong("ID");
        String s=String.valueOf(id);
        ImageView view;
        view = (ImageView) findViewById(R.id.imageView1);
        view.setOnTouchListener(this);

        if (s.equals("0")) 
        {
            view.setImageResource(R.drawable.img1);
        }
        else if (s.equals("1"))
        {
            view.setImageResource(R.drawable.img2);
        }
        else if (s.equals("2"))
        {
            view.setImageResource(R.drawable.img3);
        } 
        else 
        {
            view.setImageResource(R.drawable.img4);
        }

    }


    public boolean onTouch(View v, MotionEvent event) 
    {
        ImageView view = (ImageView) v;
        view.setScaleType(ImageView.ScaleType.MATRIX);
        float scale;

        switch (event.getAction() & 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:

            case MotionEvent.ACTION_POINTER_UP:

                                                mode = NONE;
                                                Log.d(TAG, "mode=NONE");
                                                break;

            case MotionEvent.ACTION_POINTER_DOWN: 

                                                oldDist = spacing(event);
                                                Log.d(TAG, "oldDist=" + oldDist);
                                                if (oldDist > 5f) {
                                                    savedMatrix.set(matrix);
                                                    midPoint(mid, event);
                                                    mode = ZOOM;
                                                    Log.d(TAG, "mode=ZOOM");
                                                }
                                                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);
                                                    Log.d(TAG, "newDist=" + newDist);
                                                    if (newDist > 5f) 
                                                    {
                                                        matrix.set(savedMatrix);
                                                        scale = newDist / oldDist; 
                                                        matrix.postScale(scale, scale, mid.x, mid.y);
                                                    }
                                                }
                                                break;
        }

        view.setImageMatrix(matrix); 
        return true; 
    }



    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);
    }

}

imagedisp.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:gravity="center">

    <ImageView android:layout_width="fill_parent" 
        android:id="@+id/imageView1"
        android:src="@drawable/img1" 
        android:layout_height="fill_parent"
        android:scaleType="centerInside">

    </ImageView>

</LinearLayout>

questionAnswers(1)

yourAnswerToTheQuestion