summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/photoeditor/actions/FlipAction.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/photoeditor/actions/FlipAction.java')
-rw-r--r--src/com/android/gallery3d/photoeditor/actions/FlipAction.java98
1 files changed, 70 insertions, 28 deletions
diff --git a/src/com/android/gallery3d/photoeditor/actions/FlipAction.java b/src/com/android/gallery3d/photoeditor/actions/FlipAction.java
index 00abc60a0..da238ba98 100644
--- a/src/com/android/gallery3d/photoeditor/actions/FlipAction.java
+++ b/src/com/android/gallery3d/photoeditor/actions/FlipAction.java
@@ -19,6 +19,8 @@ package com.android.gallery3d.photoeditor.actions;
import android.content.Context;
import android.util.AttributeSet;
+import com.android.gallery3d.R;
+import com.android.gallery3d.photoeditor.PhotoView;
import com.android.gallery3d.photoeditor.filters.FlipFilter;
/**
@@ -26,9 +28,14 @@ import com.android.gallery3d.photoeditor.filters.FlipFilter;
*/
public class FlipAction extends EffectAction {
- private boolean flipHorizontal;
- private boolean flipVertical;
- private TouchView touchView;
+ private static final float DEFAULT_ANGLE = 0.0f;
+ private static final float DEFAULT_FLIP_SPAN = 180.0f;
+
+ private FlipFilter filter;
+ private float horizontalFlipDegrees;
+ private float verticalFlipDegrees;
+ private Runnable queuedFlipChange;
+ private FlipView flipView;
public FlipAction(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -36,51 +43,86 @@ public class FlipAction extends EffectAction {
@Override
public void doBegin() {
- final FlipFilter filter = new FlipFilter();
+ filter = new FlipFilter();
+
+ flipView = factory.createFlipView();
+ flipView.setOnFlipChangeListener(new FlipView.OnFlipChangeListener() {
- touchView = factory.createTouchView();
- touchView.setSwipeListener(new TouchView.SwipeListener() {
+ // Directly transform photo-view because running the flip filter isn't fast enough.
+ PhotoView photoView = (PhotoView) flipView.getRootView().findViewById(
+ R.id.photo_view);
@Override
- public void onSwipeDown() {
- flipFilterVertically(filter);
+ public void onAngleChanged(float horizontalDegrees, float verticalDegrees,
+ boolean fromUser) {
+ if (fromUser) {
+ horizontalFlipDegrees = horizontalDegrees;
+ verticalFlipDegrees = verticalDegrees;
+ updateFlipFilter(false);
+ transformPhotoView(horizontalDegrees, verticalDegrees);
+ }
}
@Override
- public void onSwipeLeft() {
- flipFilterHorizontally(filter);
+ public void onStartTrackingTouch() {
+ // no-op
}
@Override
- public void onSwipeRight() {
- flipFilterHorizontally(filter);
+ public void onStopTrackingTouch() {
+ roundFlipDegrees();
+ updateFlipFilter(false);
+ transformPhotoView(horizontalFlipDegrees, verticalFlipDegrees);
+ flipView.setFlippedAngles(horizontalFlipDegrees, verticalFlipDegrees);
}
- @Override
- public void onSwipeUp() {
- flipFilterVertically(filter);
+ private void transformPhotoView(final float horizontalDegrees,
+ final float verticalDegrees) {
+ // Remove the outdated flip change before queuing a new one.
+ if (queuedFlipChange != null) {
+ photoView.remove(queuedFlipChange);
+ }
+ queuedFlipChange = new Runnable() {
+
+ @Override
+ public void run() {
+ photoView.flipPhoto(horizontalDegrees, verticalDegrees);
+ }
+ };
+ photoView.queue(queuedFlipChange);
}
});
-
- flipHorizontal = false;
- flipVertical = false;
- flipFilterHorizontally(filter);
+ flipView.setFlippedAngles(DEFAULT_ANGLE, DEFAULT_ANGLE);
+ flipView.setFlipSpan(DEFAULT_FLIP_SPAN);
+ horizontalFlipDegrees = 0;
+ verticalFlipDegrees = 0;
+ queuedFlipChange = null;
}
@Override
public void doEnd() {
- touchView.setSwipeListener(null);
+ flipView.setOnFlipChangeListener(null);
+ // Round the current flip degrees in case flip tracking has not stopped yet.
+ roundFlipDegrees();
+ updateFlipFilter(true);
}
- private void flipFilterHorizontally(final FlipFilter filter) {
- flipHorizontal = !flipHorizontal;
- filter.setFlip(flipHorizontal, flipVertical);
- notifyFilterChanged(filter, true);
+ /**
+ * Rounds flip degrees to multiples of 180 degrees.
+ */
+ private void roundFlipDegrees() {
+ if (horizontalFlipDegrees % 180 != 0) {
+ horizontalFlipDegrees = Math.round(horizontalFlipDegrees / 180) * 180;
+ }
+ if (verticalFlipDegrees % 180 != 0) {
+ verticalFlipDegrees = Math.round(verticalFlipDegrees / 180) * 180;
+ }
}
- private void flipFilterVertically(final FlipFilter filter) {
- flipVertical = !flipVertical;
- filter.setFlip(flipHorizontal, flipVertical);
- notifyFilterChanged(filter, true);
+ private void updateFlipFilter(boolean outputFilter) {
+ // Flip the filter if the flipped degrees are at the opposite directions.
+ filter.setFlip(((int) horizontalFlipDegrees / 180) % 2 != 0,
+ ((int) verticalFlipDegrees / 180) % 2 != 0);
+ notifyFilterChanged(filter, outputFilter);
}
}