diff options
Diffstat (limited to 'src/com/android/gallery3d/photoeditor/actions/FlipAction.java')
-rw-r--r-- | src/com/android/gallery3d/photoeditor/actions/FlipAction.java | 98 |
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); } } |