/** * Copyright (C) 2009 Michael A. MacDonald */ package android.androidVNC; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import com.antlersoft.android.bc.BCFactory; import com.antlersoft.android.bc.IBCScaleGestureDetector; import com.antlersoft.android.bc.OnScaleGestureListener; /** * An AbstractInputHandler that uses GestureDetector to detect standard gestures in touch events * * @author Michael A. MacDonald */ abstract class AbstractGestureInputHandler extends GestureDetector.SimpleOnGestureListener implements AbstractInputHandler, OnScaleGestureListener { protected GestureDetector gestures; protected IBCScaleGestureDetector scaleGestures; private VncCanvasActivity activity; float xInitialFocus; float yInitialFocus; boolean inScaling; private static final String TAG = "AbstractGestureInputHandler"; AbstractGestureInputHandler(VncCanvasActivity c) { activity = c; gestures=BCFactory.getInstance().getBCGestureDetector().createGestureDetector(c, this); gestures.setOnDoubleTapListener(this); scaleGestures=BCFactory.getInstance().getScaleGestureDetector(c, this); } @Override public boolean onTouchEvent(MotionEvent evt) { scaleGestures.onTouchEvent(evt); return gestures.onTouchEvent(evt); } /* (non-Javadoc) * @see com.antlersoft.android.bc.OnScaleGestureListener#onScale(com.antlersoft.android.bc.IBCScaleGestureDetector) */ //@Override public boolean onScale(IBCScaleGestureDetector detector) { boolean consumed = true; //if (detector.) //Log.i(TAG,"Focus("+detector.getFocusX()+","+detector.getFocusY()+") scaleFactor = "+detector.getScaleFactor()); // Calculate focus shift float fx = detector.getFocusX(); float fy = detector.getFocusY(); double xfs = fx - xInitialFocus; double yfs = fy - yInitialFocus; double fs = Math.sqrt(xfs * xfs + yfs * yfs); if (Math.abs(1.0 - detector.getScaleFactor())<0.02) consumed = false; if (fs * 2< Math.abs(detector.getCurrentSpan() - detector.getPreviousSpan())) { inScaling = true; if (consumed) { //Log.i(TAG,"Adjust scaling "+detector.getScaleFactor()); if (activity.vncCanvas != null && activity.vncCanvas.scaling != null) activity.vncCanvas.scaling.adjust(activity, detector.getScaleFactor(), fx, fy); } } return consumed; } /* (non-Javadoc) * @see com.antlersoft.android.bc.OnScaleGestureListener#onScaleBegin(com.antlersoft.android.bc.IBCScaleGestureDetector) */ @Override public boolean onScaleBegin(IBCScaleGestureDetector detector) { xInitialFocus = detector.getFocusX(); yInitialFocus = detector.getFocusY(); inScaling = false; //Log.i(TAG,"scale begin ("+xInitialFocus+","+yInitialFocus+")"); return true; } /* (non-Javadoc) * @see com.antlersoft.android.bc.OnScaleGestureListener#onScaleEnd(com.antlersoft.android.bc.IBCScaleGestureDetector) */ @Override public void onScaleEnd(IBCScaleGestureDetector detector) { //Log.i(TAG,"scale end"); inScaling = false; } }