3
+/**
4
+ * Interface for a callback for rotation
5
+ * Created by ChenSL on 2015/9/16.
6
+ */
7
+public interface IRotateListener {
8
+    /**
9
+     * callback for rotation
10
+     *
11
+     * @param degree degree of rotation
12
+     */
13
+    void rotate(int degree, int pivotX, int pivotY);
14
+
15
+    /**
16
+     * MotionEvent.ACTION_POINTER_UP happens when two finger minus to only one
17
+     * change the ImageView to 0,90,180,270
18
+     */
19
+    void upRotate(int pivotX, int pivotY);
20
+}

+ 27 - 0
views/src/main/java/com/android/views/rotatephotoview/gestures/OnGestureListener.java

@@ -0,0 +1,27 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.gestures;
17
+
18
+public interface OnGestureListener {
19
+
20
+    void onDrag(float dx, float dy);
21
+
22
+    void onFling(float startX, float startY, float velocityX,
23
+                 float velocityY);
24
+
25
+    void onScale(float scaleFactor, float focusX, float focusY);
26
+
27
+}

+ 113 - 0
views/src/main/java/com/android/views/rotatephotoview/gestures/RotateGestureDetector.java

@@ -0,0 +1,113 @@
1
+package com.android.views.rotatephotoview.gestures;
2
+
3
+import android.view.MotionEvent;
4
+
5
+/**
6
+ * Handle ImageView rotate event with two fingers
7
+ * Created by ChenSL on 2015/9/16.
8
+ */
9
+public class RotateGestureDetector implements IRotateDetector {
10
+    private int mLastAngle = 0;
11
+    private IRotateListener mListener;
12
+    private boolean mIsRotate;
13
+
14
+    /**
15
+     * set rotation listener for callback
16
+     *
17
+     * @param listener a  rotation listener
18
+     */
19
+    public void setRotateListener(IRotateListener listener) {
20
+        this.mListener = listener;
21
+    }
22
+
23
+    @Override
24
+    public boolean onTouchEvent(MotionEvent event) {
25
+        return doRotate(event);
26
+    }
27
+
28
+    @Override
29
+    public boolean isRotating() {
30
+        return mIsRotate;
31
+    }
32
+
33
+    /**
34
+     * handle rotation
35
+     *
36
+     * @param ev Motion event
37
+     * @return always true.
38
+     */
39
+    private boolean doRotate(MotionEvent ev) {
40
+        if (ev.getPointerCount() != 2) {
41
+            return false;
42
+        }
43
+        //Calculate the angle between the two fingers
44
+        int pivotX = (int) (ev.getX(0) + ev.getX(1)) / 2;
45
+        int pivotY = (int) (ev.getY(0) + ev.getY(1)) / 2;
46
+        float deltaX = ev.getX(0) - ev.getX(1);
47
+        float deltaY = ev.getY(0) - ev.getY(1);
48
+        double radians = Math.atan(deltaY / deltaX);
49
+        //Convert to degrees
50
+        int degrees = (int) (radians * 180 / Math.PI);
51
+        /*
52
+         * Must use getActionMasked() for switching to pick up pointer events.
53
+         * These events have the pointer index encoded in them so the return
54
+         * from getAction() won't match the exact action constant.
55
+         */
56
+        switch (ev.getActionMasked()) {
57
+            case MotionEvent.ACTION_DOWN:
58
+                mLastAngle = degrees;
59
+                mIsRotate = false;
60
+                break;
61
+            case MotionEvent.ACTION_UP:
62
+                mIsRotate = false;
63
+                break;
64
+            case MotionEvent.ACTION_POINTER_DOWN:
65
+                mLastAngle = degrees;
66
+                mIsRotate = false;
67
+                break;
68
+            case MotionEvent.ACTION_CANCEL:
69
+            case MotionEvent.ACTION_POINTER_UP:
70
+                mIsRotate = false;
71
+                upRotate(pivotX, pivotY);
72
+                mLastAngle = degrees;
73
+                break;
74
+            case MotionEvent.ACTION_MOVE:
75
+                mIsRotate = true;
76
+                int degreesValue = degrees - mLastAngle;
77
+                if (degreesValue > 45) {
78
+                    //Going CCW across the boundary
79
+                    rotate(-5, pivotX, pivotY);
80
+                } else if (degreesValue < -45) {
81
+                    //Going CW across the boundary
82
+                    rotate(5, pivotX, pivotY);
83
+                } else {
84
+                    //Normal rotation, rotate the difference
85
+                    rotate(degreesValue, pivotX, pivotY);
86
+                }
87
+                //Save the current angle
88
+                mLastAngle = degrees;
89
+                break;
90
+        }
91
+        return true;
92
+    }
93
+
94
+    /**
95
+     * to invoke the callback
96
+     *
97
+     * @param degree degree to rotate
98
+     */
99
+    private void rotate(int degree, int pivotX, int pivotY) {
100
+        if (mListener != null) {
101
+            mListener.rotate(degree, pivotX, pivotY);
102
+        }
103
+    }
104
+
105
+    /**
106
+     * to invoke the finger up action
107
+     */
108
+    private void upRotate(int pivotX, int pivotY) {
109
+        if (mListener != null) {
110
+            mListener.upRotate(pivotX, pivotY);
111
+        }
112
+    }
113
+}

+ 42 - 0
views/src/main/java/com/android/views/rotatephotoview/gestures/VersionedGestureDetector.java

@@ -0,0 +1,42 @@
1
+package com.android.views.rotatephotoview.gestures;
2
+
3
+/*******************************************************************************
4
+ * Copyright 2011, 2012 Chris Banes.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ *******************************************************************************/
18
+
19
+import android.content.Context;
20
+import android.os.Build;
21
+
22
+public final class VersionedGestureDetector {
23
+
24
+    public static GestureDetector newInstance(Context context,
25
+                                              OnGestureListener listener) {
26
+        final int sdkVersion = Build.VERSION.SDK_INT;
27
+        GestureDetector detector;
28
+
29
+        if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
30
+            detector = new CupcakeGestureDetector(context);
31
+        } else if (sdkVersion < Build.VERSION_CODES.FROYO) {
32
+            detector = new EclairGestureDetector(context);
33
+        } else {
34
+            detector = new FroyoGestureDetector(context);
35
+        }
36
+
37
+        detector.setOnGestureListener(listener);
38
+
39
+        return detector;
40
+    }
41
+
42
+}

+ 35 - 0
views/src/main/java/com/android/views/rotatephotoview/log/LogManager.java

@@ -0,0 +1,35 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.log;
17
+
18
+import android.util.Log;
19
+
20
+/**
21
+ * class that holds the {@link Logger} for this library, defaults to {@link LoggerDefault} to send logs to android {@link Log}
22
+ */
23
+public final class LogManager {
24
+
25
+    private static Logger logger = new LoggerDefault();
26
+
27
+    public static void setLogger(Logger newLogger) {
28
+        logger = newLogger;
29
+    }
30
+
31
+    public static Logger getLogger() {
32
+        return logger;
33
+    }
34
+
35
+}

+ 116 - 0
views/src/main/java/com/android/views/rotatephotoview/log/Logger.java

@@ -0,0 +1,116 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.log;
17
+
18
+/**
19
+ * interface for a logger class to replace the static calls to {@link android.util.Log}
20
+ */
21
+public interface Logger {
22
+    /**
23
+     * Send a {@link android.util.Log#VERBOSE} log message.
24
+     *
25
+     * @param tag Used to identify the source of a log message.  It usually identifies
26
+     *            the class or activity where the log call occurs.
27
+     * @param msg The message you would like logged.
28
+     */
29
+    int v(String tag, String msg);
30
+
31
+    /**
32
+     * Send a {@link android.util.Log#VERBOSE} log message and log the exception.
33
+     *
34
+     * @param tag Used to identify the source of a log message.  It usually identifies
35
+     *            the class or activity where the log call occurs.
36
+     * @param msg The message you would like logged.
37
+     * @param tr  An exception to log
38
+     */
39
+    int v(String tag, String msg, Throwable tr);
40
+
41
+    /**
42
+     * Send a {@link android.util.Log#DEBUG} log message.
43
+     *
44
+     * @param tag Used to identify the source of a log message.  It usually identifies
45
+     *            the class or activity where the log call occurs.
46
+     * @param msg The message you would like logged.
47
+     */
48
+    int d(String tag, String msg);
49
+
50
+    /**
51
+     * Send a {@link android.util.Log#DEBUG} log message and log the exception.
52
+     *
53
+     * @param tag Used to identify the source of a log message.  It usually identifies
54
+     *            the class or activity where the log call occurs.
55
+     * @param msg The message you would like logged.
56
+     * @param tr  An exception to log
57
+     */
58
+    int d(String tag, String msg, Throwable tr);
59
+
60
+    /**
61
+     * Send an {@link android.util.Log#INFO} log message.
62
+     *
63
+     * @param tag Used to identify the source of a log message.  It usually identifies
64
+     *            the class or activity where the log call occurs.
65
+     * @param msg The message you would like logged.
66
+     */
67
+    int i(String tag, String msg);
68
+
69
+    /**
70
+     * Send a {@link android.util.Log#INFO} log message and log the exception.
71
+     *
72
+     * @param tag Used to identify the source of a log message.  It usually identifies
73
+     *            the class or activity where the log call occurs.
74
+     * @param msg The message you would like logged.
75
+     * @param tr  An exception to log
76
+     */
77
+    int i(String tag, String msg, Throwable tr);
78
+
79
+    /**
80
+     * Send a {@link android.util.Log#WARN} log message.
81
+     *
82
+     * @param tag Used to identify the source of a log message.  It usually identifies
83
+     *            the class or activity where the log call occurs.
84
+     * @param msg The message you would like logged.
85
+     */
86
+    int w(String tag, String msg);
87
+
88
+    /**
89
+     * Send a {@link android.util.Log#WARN} log message and log the exception.
90
+     *
91
+     * @param tag Used to identify the source of a log message.  It usually identifies
92
+     *            the class or activity where the log call occurs.
93
+     * @param msg The message you would like logged.
94
+     * @param tr  An exception to log
95
+     */
96
+    int w(String tag, String msg, Throwable tr);
97
+
98
+    /**
99
+     * Send an {@link android.util.Log#ERROR} log message.
100
+     *
101
+     * @param tag Used to identify the source of a log message.  It usually identifies
102
+     *            the class or activity where the log call occurs.
103
+     * @param msg The message you would like logged.
104
+     */
105
+    int e(String tag, String msg);
106
+
107
+    /**
108
+     * Send a {@link android.util.Log#ERROR} log message and log the exception.
109
+     *
110
+     * @param tag Used to identify the source of a log message.  It usually identifies
111
+     *            the class or activity where the log call occurs.
112
+     * @param msg The message you would like logged.
113
+     * @param tr  An exception to log
114
+     */
115
+    int e(String tag, String msg, Throwable tr);
116
+}

+ 76 - 0
views/src/main/java/com/android/views/rotatephotoview/log/LoggerDefault.java

@@ -0,0 +1,76 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.log;
17
+
18
+import android.util.Log;
19
+
20
+/**
21
+ * Helper class to redirect {@link LogManager#logger} to {@link Log}
22
+ */
23
+public class LoggerDefault implements Logger {
24
+
25
+    @Override
26
+    public int v(String tag, String msg) {
27
+        return Log.v(tag, msg);
28
+    }
29
+
30
+    @Override
31
+    public int v(String tag, String msg, Throwable tr) {
32
+        return Log.v(tag, msg, tr);
33
+    }
34
+
35
+    @Override
36
+    public int d(String tag, String msg) {
37
+        return Log.d(tag, msg);
38
+    }
39
+
40
+    @Override
41
+    public int d(String tag, String msg, Throwable tr) {
42
+        return Log.d(tag, msg, tr);
43
+    }
44
+
45
+    @Override
46
+    public int i(String tag, String msg) {
47
+        return Log.i(tag, msg);
48
+    }
49
+
50
+    @Override
51
+    public int i(String tag, String msg, Throwable tr) {
52
+        return Log.i(tag, msg, tr);
53
+    }
54
+
55
+    @Override
56
+    public int w(String tag, String msg) {
57
+        return Log.w(tag, msg);
58
+    }
59
+
60
+    @Override
61
+    public int w(String tag, String msg, Throwable tr) {
62
+        return Log.w(tag, msg, tr);
63
+    }
64
+
65
+    @Override
66
+    public int e(String tag, String msg) {
67
+        return Log.e(tag, msg);
68
+    }
69
+
70
+    @Override
71
+    public int e(String tag, String msg, Throwable tr) {
72
+        return Log.e(tag, msg, tr);
73
+    }
74
+
75
+
76
+}

+ 61 - 0
views/src/main/java/com/android/views/rotatephotoview/scrollerproxy/GingerScroller.java

@@ -0,0 +1,61 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.scrollerproxy;
17
+
18
+import android.annotation.TargetApi;
19
+import android.content.Context;
20
+import android.widget.OverScroller;
21
+
22
+@TargetApi(9)
23
+public class GingerScroller extends ScrollerProxy {
24
+
25
+    protected final OverScroller mScroller;
26
+
27
+    public GingerScroller(Context context) {
28
+        mScroller = new OverScroller(context);
29
+    }
30
+
31
+    @Override
32
+    public boolean computeScrollOffset() {
33
+        return mScroller.computeScrollOffset();
34
+    }
35
+
36
+    @Override
37
+    public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY,
38
+                      int overX, int overY) {
39
+        mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, overX, overY);
40
+    }
41
+
42
+    @Override
43
+    public void forceFinished(boolean finished) {
44
+        mScroller.forceFinished(finished);
45
+    }
46
+
47
+    @Override
48
+    public boolean isFinished() {
49
+        return mScroller.isFinished();
50
+    }
51
+
52
+    @Override
53
+    public int getCurrX() {
54
+        return mScroller.getCurrX();
55
+    }
56
+
57
+    @Override
58
+    public int getCurrY() {
59
+        return mScroller.getCurrY();
60
+    }
61
+}

+ 33 - 0
views/src/main/java/com/android/views/rotatephotoview/scrollerproxy/IcsScroller.java

@@ -0,0 +1,33 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.scrollerproxy;
17
+
18
+import android.annotation.TargetApi;
19
+import android.content.Context;
20
+
21
+@TargetApi(14)
22
+public class IcsScroller extends GingerScroller {
23
+
24
+    public IcsScroller(Context context) {
25
+        super(context);
26
+    }
27
+
28
+    @Override
29
+    public boolean computeScrollOffset() {
30
+        return mScroller.computeScrollOffset();
31
+    }
32
+
33
+}

+ 58 - 0
views/src/main/java/com/android/views/rotatephotoview/scrollerproxy/PreGingerScroller.java

@@ -0,0 +1,58 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.scrollerproxy;
17
+
18
+import android.content.Context;
19
+import android.widget.Scroller;
20
+
21
+public class PreGingerScroller extends ScrollerProxy {
22
+
23
+    private final Scroller mScroller;
24
+
25
+    public PreGingerScroller(Context context) {
26
+        mScroller = new Scroller(context);
27
+    }
28
+
29
+    @Override
30
+    public boolean computeScrollOffset() {
31
+        return mScroller.computeScrollOffset();
32
+    }
33
+
34
+    @Override
35
+    public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY,
36
+                      int overX, int overY) {
37
+        mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
38
+    }
39
+
40
+    @Override
41
+    public void forceFinished(boolean finished) {
42
+        mScroller.forceFinished(finished);
43
+    }
44
+
45
+    public boolean isFinished() {
46
+        return mScroller.isFinished();
47
+    }
48
+
49
+    @Override
50
+    public int getCurrX() {
51
+        return mScroller.getCurrX();
52
+    }
53
+
54
+    @Override
55
+    public int getCurrY() {
56
+        return mScroller.getCurrY();
57
+    }
58
+}

+ 48 - 0
views/src/main/java/com/android/views/rotatephotoview/scrollerproxy/ScrollerProxy.java

@@ -0,0 +1,48 @@
1
+/*******************************************************************************
2
+ * Copyright 2011, 2012 Chris Banes.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *******************************************************************************/
16
+package com.android.views.rotatephotoview.scrollerproxy;
17
+
18
+import android.content.Context;
19
+import android.os.Build.VERSION;
20
+import android.os.Build.VERSION_CODES;
21
+
22
+public abstract class ScrollerProxy {
23
+
24
+    public static ScrollerProxy getScroller(Context context) {
25
+        if (VERSION.SDK_INT < VERSION_CODES.GINGERBREAD) {
26
+            return new PreGingerScroller(context);
27
+        } else if (VERSION.SDK_INT < VERSION_CODES.ICE_CREAM_SANDWICH) {
28
+            return new GingerScroller(context);
29
+        } else {
30
+            return new IcsScroller(context);
31
+        }
32
+    }
33
+
34
+    public abstract boolean computeScrollOffset();
35
+
36
+    public abstract void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY,
37
+                               int maxY, int overX, int overY);
38
+
39
+    public abstract void forceFinished(boolean finished);
40
+
41
+    public abstract boolean isFinished();
42
+
43
+    public abstract int getCurrX();
44
+
45
+    public abstract int getCurrY();
46
+
47
+
48
+}

Kodo/kodo - Gogs: Go Git Service

5 Ревизии (95bd0c9ccddc0404d8fdbdec81885a814a2ce30b)

Автор SHA1 Съобщение Дата
  Brightcells 597ee33ba6 Pai2 => Kodo преди 7 години
  Brightcells a7b59d4389 Redis' set/setex/get => RedisExtensions' setjson/setexjson/getjson преди 8 години
  Brightcells 246a9ff4b8 Change to 'from utils.redis.connect import r' преди 8 години
  Brightcells e4c95c78c7 tstrip преди 9 години
  Brightcells dd00e3b1a9 add api online_api преди 9 години