设置图像的最大和最小缩放级别[重复]

时间:2022-05-28 04:54:01

Possible Duplicate:
Imageview issue with zoom in and out,drag with maximum and minimum levels

可能重复:放大和缩小的Imageview问题,使用最大和最小级别拖动

I have image zooming and dragging in my application. My requirement is the image sets maximum and minimum zooming levels. I have used the below code.

我在我的应用程序中有图像缩放和拖动。我的要求是图像设置最大和最小缩放级别。我使用了以下代码。

public class PinchZoomListener 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();

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

    // Remember some things for zooming
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;

    public boolean onTouch(View v, MotionEvent event) {
        ImageView view = (ImageView) v;
        dumpEvent(event);// Dump touch event to log

        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_UP:
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            Log.d(TAG, "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);
                Log.d(TAG, "newDist=" + newDist);
                if (newDist > 10f) {
                    matrix.set(savedMatrix);
                    float scale = newDist / oldDist;
                    matrix.postScale(scale, scale, mid.x, mid.y);
                }
            }
            break;
        }
        view.setImageMatrix(matrix);
        return true; // indicate event was handled
    }

    /** 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 & 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("]");
        Log.d(TAG, sb.toString());
    }

    /** Determine the space between the first two fingers */
    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);
    }

    /** Calculate the mid point of the first two fingers */
    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);
    }
}

How can I set maximum and minimum zooming levels for image in Android?

如何在Android中设置图像的最大和最小缩放级别?

1 个解决方案

#1


0  

You ought to rework your code, because you're using relative scales and offsets for every touch event, and there's no possible way to find out what is the absolute value of current image zoom and/or offset.

您应该重新编写代码,因为您正在为每个触摸事件使用相对比例和偏移,并且没有可能的方法来找出当前图像缩放和/或偏移的绝对值。

Save the absolute value of your zoom somewhere, and then you may use the before mentioned min(max(MIN,zoom),MAX) piece of code.

在某处保存缩放的绝对值,然后您可以使用前面提到的最小(最大(最小,缩放),MAX)代码片段。

#1


0  

You ought to rework your code, because you're using relative scales and offsets for every touch event, and there's no possible way to find out what is the absolute value of current image zoom and/or offset.

您应该重新编写代码,因为您正在为每个触摸事件使用相对比例和偏移,并且没有可能的方法来找出当前图像缩放和/或偏移的绝对值。

Save the absolute value of your zoom somewhere, and then you may use the before mentioned min(max(MIN,zoom),MAX) piece of code.

在某处保存缩放的绝对值,然后您可以使用前面提到的最小(最大(最小,缩放),MAX)代码片段。