Android Pinch und Zoom Image in Aktivität

Ich habe eine ListView mit einer Reihe von Bildern. Wenn Sie auf eines davon klicken, wird das angeklickte Bild in einer neuen Aktivität und in der Mitte der Aktivität in ImageView angezeigt. Außerdem ist es zoombar. Das Problem ist, wenn ich das Bild zoome, wird es vergrößert, bewegt sich aber auch wie Ziehen und Ablegen. Ich sollte diese Bewegung des Bildes eliminieren und sollte nur vom Zentrum der Aktivität zoombar sein.

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>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage