+/**
+ * Interface for a callback for rotation
+ * Created by ChenSL on 2015/9/16.
+ */
+public interface IRotateListener {
+ /**
+ * callback for rotation
+ *
+ * @param degree degree of rotation
+ */
+ void rotate(int degree, int pivotX, int pivotY);
+
+ /**
+ * MotionEvent.ACTION_POINTER_UP happens when two finger minus to only one
+ * change the ImageView to 0,90,180,270
+ */
+ void upRotate(int pivotX, int pivotY);
+}
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |
@@ -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 |
+} |