lmw
2025-04-24 718f31c92e2029d05260810435a2c70cef6e6ce5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.ypx.imagepicker.widget.cropimage;
 
import android.view.MotionEvent;
 
/**
 * Description: 旋转手势
 * <p>
 * Author: peixing.yang
 * Date: 2019/2/21
 */
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);
    }
}