pinch/zoom for Android Java
This humble code interpretes the distance between two pointers as the ratio.
static final int NumberOfMyPointers = 2; static final float minimumDistance2object = 0.1f; static final float maximumDistance2object = 3.0f; static final float MaxRatio2Screen = 5.0f; ////////////////////////////////////////////// private float pointerCoord_X[]; private float pointerCoord_Y[]; private float pointersDistance; private float pointersDistance_current; private float pointersDistance_origin; private float pointersDistance_delta; private float distance2object; ////////////////////////////////////////////// public void resetOrigin(){ float dX, dY; dX = pointerCoord_X[1] - pointerCoord_X[0]; dY = pointerCoord_Y[1] - pointerCoord_Y[0]; pointersDistance_origin = (float) Math.sqrt((dX*dX)+(dY*dY)); } @Override public void onTouchEvent(MotionEvent me) { // by Android API ref., // idx = [0, getPointerCount() -1] // id = keep while touched, reset on down to minimum empty. // The bottom line is, all you should refer is idx 0 and 1. Id is useless for zoom and pinch. int i, j; float dX, dY, d; int ma = me.getActionMasked(); int me_num_pointers = me.getPointerCount(); switch(ma){ case(MotionEvent.ACTION_POINTER_DOWN): if (me_num_pointers < NumberOfMyPointers) break; for (i=0;i<NumberOfMyPointers;i++){ pointerCoord_X[i] = me.getX(i); pointerCoord_Y[i] = me.getY(i); } resetOrigin(); pointersDistance += pointersDistance_delta; break; case(MotionEvent.ACTION_MOVE): if (me_num_pointers < NumberOfMyPointers) break; for (i=0;i<NumberOfMyPointers;i++){ pointerCoord_X[i] = me.getX(i); pointerCoord_Y[i] = me.getY(i); } dX = pointerCoord_X[1] - pointerCoord_X[0]; dY = pointerCoord_Y[1] - pointerCoord_Y[0]; pointersDistance_current = (float) Math.sqrt((dX*dX)+(dY*dY)); pointersDistance_delta = pointersDistance_current - pointersDistance_origin; d = pointersDistance + pointersDistance_delta; if (d < screenWidth){ resetOrigin(); pointersDistance_delta = screenWidth - pointersDistance; d = screenWidth; }else if (d > MaxRatio2Screen*screenWidth){ resetOrigin(); pointersDistance_delta = 5.0f*w - pointersDistance; d = MaxRatio2Screen*screenWidth; } distance2object = ((float)screenWidth)/d; break; default: break; } super.onTouchEvent(me); }