From 734598c39e6a9d809982dae2907dc7d10e0b0e9f Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Wed, 21 Aug 2013 15:25:05 -0700 Subject: Add support to "go-to-next" in film strip. bug:10328123 Change-Id: I018876df89cc7ed125a32af850e6b26114fb1004 --- src/com/android/camera/CameraActivity.java | 4 + src/com/android/camera/PhotoUI.java | 3 +- src/com/android/camera/VideoUI.java | 2 +- src/com/android/camera/ui/FilmStripView.java | 105 ++++++++++++++++++--------- 4 files changed, 75 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 1baa865fd..411b29ea7 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -127,6 +127,10 @@ public class CameraActivity extends Activity private ActionBar mActionBar; private Menu mActionBarMenu; + public void gotoGallery() { + mFilmStripView.getController().goToNextItem(); + } + private class MyOrientationEventListener extends OrientationEventListener { public MyOrientationEventListener(Context context) { diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 43862d376..6157d0f1d 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -321,8 +321,7 @@ public class PhotoUI implements PieListener, mPreviewThumb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - // TODO: go to filmstrip - // mActivity.gotoGallery(); + mActivity.gotoGallery(); } }); mMenuButton = mRootView.findViewById(R.id.menu); diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index 684179698..d31b8c115 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -418,7 +418,7 @@ public class VideoUI implements PieRenderer.PieListener, mPreviewThumb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - // TODO: Go to filmstrip view + mActivity.gotoGallery(); } }); } diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 4d37f04c4..85ebd6cc5 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -28,6 +28,7 @@ import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import android.widget.Scroller; @@ -43,7 +44,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private static final String TAG = "CAM_FilmStripView"; private static final int BUFFER_SIZE = 5; - private static final int DURATION_GEOMETRY_ADJUST = 200; + private static final int GEOMETRY_ADJUST_TIME_MS = 400; private static final int SNAP_IN_CENTER_TIME_MS = 600; private static final float FILM_STRIP_SCALE = 0.6f; private static final float FULL_SCREEN_SCALE = 1f; @@ -341,17 +342,19 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { public void fling(float velocity); - public void scrollTo(int position, int duration, boolean interruptible); + public void scrollToPosition(int position, int duration, boolean interruptible); + + public boolean goToNextItem(); public boolean stopScrolling(); public boolean isScrolling(); - public void gotoCameraFullScreen(); + public void goToCameraFullScreen(); - public void gotoFilmStrip(); + public void goToFilmStrip(); - public void gotoFullScreen(); + public void goToFullScreen(); } /** @@ -861,13 +864,13 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (mCenterX != currentViewCenter) { int snapInTime = (int) (SNAP_IN_CENTER_TIME_MS * Math.abs(mCenterX - currentViewCenter) / mDrawArea.width()); - mController.scrollTo(currentViewCenter, + mController.scrollToPosition(currentViewCenter, snapInTime, false); } if (getCurrentViewType() == ImageData.TYPE_STICKY_VIEW && !mController.isScalling() && mScale != FULL_SCREEN_SCALE) { - mController.gotoFullScreen(); + mController.goToFullScreen(); } } @@ -1031,7 +1034,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private void slideViewBack(View v) { v.animate().translationX(0) .alpha(1f) - .setDuration(DURATION_GEOMETRY_ADJUST) + .setDuration(GEOMETRY_ADJUST_TIME_MS) .setInterpolator(mViewAnimInterpolator) .start(); } @@ -1143,7 +1146,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { .alpha(0f) .translationYBy(transY) .setInterpolator(mViewAnimInterpolator) - .setDuration(DURATION_GEOMETRY_ADJUST) + .setDuration(GEOMETRY_ADJUST_TIME_MS) .withEndAction(new Runnable() { @Override public void run() { @@ -1236,7 +1239,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { .alpha(1f) .translationY(0f) .setInterpolator(mViewAnimInterpolator) - .setDuration(DURATION_GEOMETRY_ADJUST) + .setDuration(GEOMETRY_ADJUST_TIME_MS) .start(); invalidate(); } @@ -1457,25 +1460,39 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener { - private ValueAnimator mScaleAnimator; + private final ValueAnimator mScaleAnimator; private boolean mHasNewScale; private float mNewScale; - private Scroller mScroller; + private final Scroller mScroller; private boolean mHasNewPosition; - private DecelerateInterpolator mDecelerateInterpolator; + private final DecelerateInterpolator mDecelerateInterpolator; + private final TimeInterpolator mDecelerateAccelerateInterpolator = + new TimeInterpolator() { + private final TimeInterpolator interpolator = + new AccelerateInterpolator(); + + @Override + public float getInterpolation(float v) { + float v2 = v * 2f; + return ((v2 < 1f) ? + mDecelerateInterpolator.getInterpolation(v2) / 2f : + interpolator.getInterpolation(v2 - 1f) / 2f + 0.5f); + } + }; private boolean mCanStopScroll; MyController(Context context) { mScroller = new Scroller(context); mHasNewPosition = false; + mCanStopScroll = true; + mHasNewScale = false; + mScaleAnimator = new ValueAnimator(); mScaleAnimator.addUpdateListener(MyController.this); mScaleAnimator.addListener(MyController.this); - mDecelerateInterpolator = new DecelerateInterpolator(); - mCanStopScroll = true; - mHasNewScale = false; + mDecelerateInterpolator = new DecelerateInterpolator(1.5f); } @Override @@ -1485,7 +1502,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { @Override public boolean isScalling() { - return mScaleAnimator.isRunning(); + return (mScaleAnimator.isRunning()); } boolean hasNewGeometry() { @@ -1553,7 +1570,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (inFullScreen() && getCurrentViewType() == ImageData.TYPE_STICKY_VIEW && scaledVelocityX < 0) { // Swipe left in camera preview. - gotoFilmStrip(); + goToFilmStrip(); } int w = getWidth(); @@ -1585,7 +1602,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } @Override - public void scrollTo(int position, int duration, boolean interruptible) { + public void scrollToPosition(int position, int duration, boolean interruptible) { if (!stopScrolling()) { return; } @@ -1593,9 +1610,25 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { stopScrolling(); mScroller.startScroll(mCenterX, 0, position - mCenterX, 0, duration); + mHasNewPosition = true; invalidate(); } + @Override + public boolean goToNextItem() { + ViewItem nextItem = mViewItem[mCurrentItem + 1]; + if (nextItem == null) { + return false; + } + stopScale(); + scrollToPosition(nextItem.getCenterX(), GEOMETRY_ADJUST_TIME_MS * 2, false); + mScaleAnimator.setFloatValues(FULL_SCREEN_SCALE, FILM_STRIP_SCALE, FULL_SCREEN_SCALE); + mScaleAnimator.setInterpolator(mDecelerateAccelerateInterpolator); + mScaleAnimator.setDuration(GEOMETRY_ADJUST_TIME_MS * 2); + mScaleAnimator.start(); + return true; + } + private void scaleTo(float scale, int duration) { if (mViewItem[mCurrentItem] == null) { return; @@ -1605,13 +1638,12 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mScaleAnimator.setFloatValues(mScale, scale); mScaleAnimator.setInterpolator(mDecelerateInterpolator); mScaleAnimator.start(); - mHasNewScale = true; layoutChildren(); } @Override - public void gotoFilmStrip() { - scaleTo(FILM_STRIP_SCALE, DURATION_GEOMETRY_ADJUST); + public void goToFilmStrip() { + scaleTo(FILM_STRIP_SCALE, GEOMETRY_ADJUST_TIME_MS); if (mListener != null) { mListener.onSwitchMode(false); mBottomControls.setVisibility(View.VISIBLE); @@ -1619,10 +1651,10 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } @Override - public void gotoFullScreen() { + public void goToFullScreen() { if (mViewItem[mCurrentItem] != null) { - mController.scrollTo(mViewItem[mCurrentItem].getCenterX(), - DURATION_GEOMETRY_ADJUST, false); + mController.scrollToPosition(mViewItem[mCurrentItem].getCenterX(), + GEOMETRY_ADJUST_TIME_MS, false); } enterFullScreen(); } @@ -1639,21 +1671,21 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (inFullScreen()) { return; } - scaleTo(1f, DURATION_GEOMETRY_ADJUST); + scaleTo(1f, GEOMETRY_ADJUST_TIME_MS); } @Override - public void gotoCameraFullScreen() { + public void goToCameraFullScreen() { if (mDataAdapter.getImageData(0).getViewType() != ImageData.TYPE_STICKY_VIEW) { return; } - gotoFullScreen(); - scrollTo( + goToFullScreen(); + scrollToPosition( estimateMinX(mViewItem[mCurrentItem].getID(), mViewItem[mCurrentItem].getLeftPosition(), getWidth()), - DURATION_GEOMETRY_ADJUST, false); + GEOMETRY_ADJUST_TIME_MS, false); } @Override @@ -1668,6 +1700,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { @Override public void onAnimationStart(Animator anim) { + mHasNewScale = true; } @Override @@ -1701,7 +1734,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (inFilmStrip()) { ViewItem centerItem = mViewItem[mCurrentItem]; if (centerItem != null && centerItem.areaContains(x, y)) { - mController.gotoFullScreen(); + mController.goToFullScreen(); return true; } } else if (inFullScreen()) { @@ -1752,7 +1785,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mViewItem[i].getView().animate() .translationY(0f) .alpha(1f) - .setDuration(DURATION_GEOMETRY_ADJUST) + .setDuration(GEOMETRY_ADJUST_TIME_MS) .start(); } } @@ -1772,7 +1805,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (deltaX > 0 && inFullScreen() && getCurrentViewType() == ImageData.TYPE_STICKY_VIEW) { - mController.gotoFilmStrip(); + mController.goToFilmStrip(); } mController.scroll(deltaX); } else { @@ -1805,7 +1838,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } } else if (inFullScreen()) { if (deltaX > 0 && inCameraFullscreen()) { - mController.gotoFilmStrip(); + mController.goToFilmStrip(); } // Multiplied by 1.2 to make it more easy to swipe. mController.scroll((int) (deltaX * 1.2)); @@ -1860,9 +1893,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { @Override public void onScaleEnd() { if (mScaleTrend >= 1f) { - mController.gotoFullScreen(); + mController.goToFullScreen(); } else { - mController.gotoFilmStrip(); + mController.goToFilmStrip(); } mScaleTrend = 1f; } -- cgit v1.2.3