package whu.iss.activity; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class SimpleZoomListener implements View.OnTouchListener { public enum ControlType { PAN, ZOOM } private ControlType mControlType = ControlType.PAN; private ZoomState mState; private float mX; private float mY; private float mGap; public void setZoomState(ZoomState state) { mState = state; } public void setControlType(ControlType controlType) { mControlType = controlType; } public boolean onTouch(View v, MotionEvent event) { final int action = event.getAction(); int pointCount = event.getPointerCount(); if(pointCount == 1){ final float x = event.getX(); final float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: mX = x; mY = y; break; case MotionEvent.ACTION_MOVE: { final float dx = (x - mX) / v.getWidth(); final float dy = (y - mY) / v.getHeight(); mState.setPanX(mState.getPanX() - dx); mState.setPanY(mState.getPanY() - dy); mState.notifyObservers(); mX = x; mY = y; break; } } } if(pointCount == 2){ final float x0 = event.getX(event.getPointerId(0)); final float y0 = event.getY(event.getPointerId(0)); final float x1 = event.getX(event.getPointerId(1)); final float y1 = event.getY(event.getPointerId(1)); final float gap = getGap(x0, x1, y0, y1); switch (action) { case MotionEvent.ACTION_POINTER_2_DOWN: case MotionEvent.ACTION_POINTER_1_DOWN: mGap = gap; break; case MotionEvent.ACTION_POINTER_1_UP: mX = x1; mY = y1; break; case MotionEvent.ACTION_POINTER_2_UP: mX = x0; mY = y0; break; case MotionEvent.ACTION_MOVE: { final float dgap = (gap - mGap)/ mGap; // Log.d("Gap", String.valueOf(dgap)); Log.d("Gap", String.valueOf((float)Math.pow(20, dgap))); mState.setZoom(mState.getZoom() * (float)Math.pow(5, dgap)); mState.notifyObservers(); mGap = gap; break; } } } return true; } private float getGap(float x0, float x1, float y0, float y1){ return (float)Math.pow(Math.pow((x0-x1), 2)+Math.pow((y0-y1), 2), 0.5); } }