Skip to content

Instantly share code, notes, and snippets.

@niusounds
Last active December 29, 2015 15:09
Show Gist options
  • Save niusounds/7688455 to your computer and use it in GitHub Desktop.
Save niusounds/7688455 to your computer and use it in GitHub Desktop.
Simple RotateGestureDetector can be used in the same way as GestureDetector and ScaleGestureDetector.
import android.content.Context;
import android.view.MotionEvent;
public class RotateGestureDetector {
public static interface OnRotateListener {
boolean onRotate(float degrees, float focusX, float focusY);
}
public static class SimpleOnRotateGestureDetector implements OnRotateListener {
@Override
public boolean onRotate(float degrees, float focusX, float focusY) {
return false;
}
}
private static float RADIAN_TO_DEGREES = (float) (180.0 / Math.PI);
private OnRotateListener listener;
private float prevX = 0.0f;
private float prevY = 0.0f;
private float prevTan;
public RotateGestureDetector(OnRotateListener listener) {
this.listener = listener;
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerCount() == 2 && event.getActionMasked() == MotionEvent.ACTION_MOVE) {
boolean result = true;
float x = event.getX(1) - event.getX(0);
float y = event.getY(1) - event.getY(0);
float focusX = (event.getX(1) + event.getX(0)) * 0.5f;
float focusY = (event.getY(1) + event.getY(0)) * 0.5f;
float tan = (float) Math.atan2(y, x);
if (prevX != 0.0f && prevY != 0.0f) {
result = listener.onRotate((tan - prevTan) * RADIAN_TO_DEGREES, focusX, focusY);
}
prevX = x;
prevY = y;
prevTan = tan;
return result;
} else {
prevX = prevY = prevTan = 0.0f;
return true;
}
}
}
public class UserActivity extends Activity {
private RotateGestureDetector rotateGestureDetector;
protected void onCreate(Bundle savedInstanceState) {
rotateGestureDetector = new RotateGestureDetector(new RotateGestureDetector.SimpleOnRotateGestureDetector() {
@Override
public boolean onRotate(float degrees, float focusX, float focusY) {
// something with rotate
return true;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
rotateGestureDetector.onTouchEvent(event);
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment