package com.yuyh.library.view.common; import android.view.MotionEvent; /** * Created by q2366 on 2015/10/12. */ public class RotateGestureDetector { private static final int MAX_DEGREES_STEP = 120; private OnRotateListener mListener; private float mPrevSlope; private float mCurrSlope; private float x1; private float y1; private float x2; private float y2; public RotateGestureDetector(OnRotateListener l) { mListener = l; } public void onTouchEvent(MotionEvent event) { final int Action = event.getActionMasked(); switch (Action) { case MotionEvent.ACTION_POINTER_DOWN: case MotionEvent.ACTION_POINTER_UP: if (event.getPointerCount() == 2) mPrevSlope = caculateSlope(event); break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount() > 1) { mCurrSlope = caculateSlope(event); double currDegrees = Math.toDegrees(Math.atan(mCurrSlope)); double prevDegrees = Math.toDegrees(Math.atan(mPrevSlope)); double deltaSlope = currDegrees - prevDegrees; if (Math.abs(deltaSlope) <= MAX_DEGREES_STEP) { mListener.onRotate((float) deltaSlope, (x2 + x1) / 2, (y2 + y1) / 2); } mPrevSlope = mCurrSlope; } break; default: break; } } private float caculateSlope(MotionEvent event) { x1 = event.getX(0); y1 = event.getY(0); x2 = event.getX(1); y2 = event.getY(1); return (y2 - y1) / (x2 - x1); } public interface OnRotateListener { void onRotate(float degrees, float focusX, float focusY); } }