package com.novoda.utils; import android.util.FloatMath; import android.view.MotionEvent; public class PinchZoomDetector { public static final int OTHER = 0; public static final int ZOOMING_STARTED = 1; public static final int ZOOMING_IN = 2; public static final int ZOOMING_OUT = 3; public static final int ZOOMING_STOPPED = 4; public float minimumFingerDistance = 20f; public float zoomInterval = 50f; private boolean zooming; private float oldDistance; public PinchZoomDetector() { } public PinchZoomDetector(float minimumFingerDistance, float zoomInterval) { this.minimumFingerDistance = minimumFingerDistance; this.zoomInterval = zoomInterval; } public PinchZoomDetector(float zoomInterval) { this.zoomInterval = zoomInterval; } public int detectZoom(MotionEvent event) { int result = OTHER; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_MOVE: result = moving(event); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: result = release(event); break; } return result; } private int moving(MotionEvent event) { int result = OTHER; float distance = fingerDistance(event); if (zooming == false) { if (event.getPointerCount() > 1) { if (distance > minimumFingerDistance) { zooming = true; oldDistance = distance; result = ZOOMING_STARTED; } } } if (zooming) { if (distance + zoomInterval < oldDistance) { result = ZOOMING_OUT; oldDistance = distance; } else if (distance - zoomInterval > oldDistance) { result = ZOOMING_IN; oldDistance = distance; } } return result; } private int release(MotionEvent event) { int result = OTHER; if (zooming) { zooming = false; result = ZOOMING_STOPPED; } return result; } private float fingerDistance(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); } }