简体   繁体   English

如何在android中放大/缩小ImageView(不使用Canvas)

[英]How to Zoom in/Out an ImageView(not using Canvas) in android

I am working on app in which i have to rotate,drag n drop and zoom in/out an image(smaller one) over another image(bigger one). 我正在开发应用程序,我必须旋转,拖放和放大/缩小图像(较小的一个)而不是另一个图像(较大的一个)。 I am done with rotation and drag n drop but not able to implement zoom in/out. 我已完成旋转和拖动但不能实现放大/缩小。 I know how to do it on canvas But in my app I am not using Canvas. 我知道如何在画布上做到但在我的应用程序中我不使用Canvas。 Any Help would be Grateful.......... 任何帮助都会感激..........

Thanks Davender 谢谢Davender

check out the following code and let me know if it helps. 查看以下代码,如果有帮助请告诉我。

public class Touch extends Activity implements OnTouchListener {

private static final String TAG = "Touch" ;
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF start = new  PointF();
public static PointF mid = new PointF();

// We can be in one of these 3 states
public static final int NONE = 0;
public static final int DRAG = 1;
public static final int ZOOM = 2;
public static int mode = NONE;

float oldDist;

private float[] matrixValues = new float[9];

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView view = (ImageView) findViewById(R.id.imageView);
    view.setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {

    ImageView view = (ImageView) v;

    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_POINTER_DOWN:

        oldDist = spacing(event);
        Log.d(TAG, "oldDist=" + oldDist);
        if (oldDist > 10f) {

            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 > 10f) {

                matrix.set(savedMatrix);
                float scale = newDist / oldDist;
                matrix.postScale(scale, scale, mid.x, mid.y);
            }
        }
        break;

    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:

        mode = NONE;
        Log.d(TAG, "mode=NONE" );
        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);
}

} }

Following is the main.xml file 以下是main.xml文件

<?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
    <ImageView 
            android:id="@+id/imageView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:src="@drawable/yourimage"
            android:scaleType="matrix">
    </ImageView>
    </FrameLayout>

replace the value of src property of the imageview (yourimage), to name of the image you have in your project. 将imageview(yourimage)的src属性值替换为项目中的图像名称。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM