0

I am new In Android.I have done zooming in image view.Now facing some problem. 1)can't set the zoom level. 2)Also image is moving. i wanna stop that here is my code:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.show_image);
    imageView1 = (ImageView) findViewById(R.id.showImageView1);
    imageView2 = (ImageView) findViewById(R.id.Food_pic2);
    // get image path from list View
    Intent intent = getIntent();
    int path1 = intent.getIntExtra("image1", 0);
    int path2 = intent.getIntExtra("image2", 0);
    imageView1.setImageResource(path1);
    imageView1.setOnTouchListener(this);

}

here is my Touch listener

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

    ImageView view = (ImageView) v;
    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());
        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");
        savedMatrix.set(matrix);

        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;

}

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

I searched and see maximum related to this. but i can't solve my problem.

How and where i write code for setting zoom level and stop moving my image view.

Thanks in advance.

Shihab Uddin
  • 6,699
  • 2
  • 59
  • 74

1 Answers1

1

This is where the movement is happening:

if (mode == DRAG) {

            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x, event.getY()
                    - start.y);
        } 

If you dont want movement, then do nothing inside the if block.

If you dont want zooming in or out by the user also, then you can leave this part blank too:

else if (mode == ZOOM) {
            float newDist = spacing(event);
            Log.d(TAG, "newDist=" + newDist);
            if (newDist > 10f) {
                matrix.set(savedMatrix);
                float scale = newDist / oldDist;
                // i edited here.
                //i  set zoom level here 
                matrix.getValues(matrixValues);
                float currentScale = matrixValues[Matrix.MSCALE_X];
                if (scale * currentScale > MAX_ZOOM) {
                    scale = MAX_ZOOM / currentScale;
                } else if (scale * currentScale < MIN_ZOOM) {
                    scale = MIN_ZOOM / currentScale;
                }

                matrix.postScale(scale, scale, mid.x, mid.y);
            }
        }

If you wanna set zoom level, just before you do view.setImageMatrix(matrix) you can scale your image manually using

matrix.postScale(val1,val2,val3,val4);

play around with the values inside the function to get the zoom level you want since that's the function that's setting the zoom level.

Shihab Uddin
  • 6,699
  • 2
  • 59
  • 74
Anup Cowkur
  • 20,443
  • 6
  • 51
  • 84
  • Now i finish the job. But after pinch zooming the image is displaced i want to set it where it was. and can you please tell me how to restrict the image within the screen.@Anup Cowkur – Shihab Uddin Oct 07 '12 at 06:00
  • it's an overridden method. It takes 2 forms. Refer http://developer.android.com/reference/android/graphics/Matrix.html#postScale(float, float) – Anup Cowkur Oct 07 '12 at 06:01
  • dude,can't understand...@Anup Cowkar – Shihab Uddin Oct 07 '12 at 06:08
  • The image will be displaced because that's how android is designed. Do not change this behavior as all users are used to this. If you zoom out back to default level then image should come back to where it was automatically. – Anup Cowkur Oct 07 '12 at 06:46
  • thanks man. Rotating the picture is possible? links or code is appreciable.@Anup Cowkar – Shihab Uddin Oct 07 '12 at 06:55
  • Sure it is. See here http://stackoverflow.com/questions/5389613/rotate-image-in-android – Anup Cowkur Oct 07 '12 at 08:05
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/17668/discussion-between-shihab-returns-and-anup-cowkur) – Shihab Uddin Oct 07 '12 at 08:22