From edbba628dc2e31057b304c6a431f44dbca125891 Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Thu, 12 Sep 2013 14:49:48 -0700 Subject: Avoid flickering after swipe to delete. bug:10624385 Change-Id: Id4d65a391b2d13a5d6cc08ae9c1b787610c94c46 --- src/com/android/camera/ui/FilmStripView.java | 52 +++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 571462177..ffa3f7ab5 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -92,6 +92,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { // This is true if and only if the user is scrolling, private boolean mIsUserScrolling; + private ValueAnimator.AnimatorUpdateListener mViewItemUpdateListener; /** * Common interface for all images in the filmstrip. @@ -380,19 +381,24 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private View mView; private RectF mViewArea; + private ValueAnimator mTranslationXAnimator; + /** * Constructor. * * @param id The id of the data from {@link DataAdapter}. * @param v The {@code View} representing the data. */ - public ViewItem(int id, View v) { + public ViewItem( + int id, View v, ValueAnimator.AnimatorUpdateListener listener) { v.setPivotX(0f); v.setPivotY(0f); mDataId = id; mView = v; mLeftPosition = -1; mViewArea = new RectF(); + mTranslationXAnimator = new ValueAnimator(); + mTranslationXAnimator.addUpdateListener(listener); } /** Returns the data id from {@link DataAdapter}. */ @@ -458,6 +464,14 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mView.setTranslationX(transX * scale); } + public void animateTranslationX( + float targetX, long duration_ms, TimeInterpolator interpolator) { + mTranslationXAnimator.setInterpolator(interpolator); + mTranslationXAnimator.setDuration(duration_ms); + mTranslationXAnimator.setFloatValues(mView.getTranslationX(), targetX); + mTranslationXAnimator.start(); + } + /** Adjusts the translation of X regarding the view scale. */ public void translateXBy(float transX, float scale) { mView.setTranslationX(mView.getTranslationX() + transX * scale); @@ -513,7 +527,9 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { * @param scale The current scale of the filmstrip. */ public void layoutIn(Rect drawArea, int refCenter, float scale) { - int left = (int) (drawArea.centerX() + (mLeftPosition - refCenter) * scale); + final float translationX = (mTranslationXAnimator.isRunning() ? + (Float) mTranslationXAnimator.getAnimatedValue() : 0f); + int left = (int) (drawArea.centerX() + (mLeftPosition - refCenter + translationX) * scale); int top = (int) (drawArea.centerY() - (mView.getMeasuredHeight() / 2) * scale); layoutAt(left, top); mView.setScaleX(scale); @@ -624,6 +640,14 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mGestureRecognizer = new FilmStripGestureRecognizer(cameraActivity, new MyGestureReceiver()); mSlop = (int) getContext().getResources().getDimension(R.dimen.pie_touch_slop); + mViewItemUpdateListener = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + // Force the geometry update to happen to layout the view items. + mController.forceGeometryUpdate(); + invalidate(); + } + }; } /** @@ -800,7 +824,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { if (v == null) { return null; } - ViewItem item = new ViewItem(dataID, v); + ViewItem item = new ViewItem(dataID, v, mViewItemUpdateListener); v = item.getView(); if (v != mCameraView) { addView(item.getView()); @@ -1260,8 +1284,10 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } } - private void slideViewBack(View v) { - v.animate().translationX(0) + private void slideViewBack(ViewItem item) { + item.animateTranslationX( + 0, GEOMETRY_ADJUST_TIME_MS, mViewAnimInterpolator); + item.getView().animate() .alpha(1f) .setDuration(GEOMETRY_ADJUST_TIME_MS) .setInterpolator(mViewAnimInterpolator) @@ -1363,7 +1389,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { for (int i = 0; i < BUFFER_SIZE; i++) { if (mViewItem[i] != null && mViewItem[i].getScaledTranslationX(mScale) != 0f) { - slideViewBack(mViewItem[i].getView()); + slideViewBack(mViewItem[i]); } } @@ -1440,7 +1466,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mViewItem[i] = mViewItem[i - 1]; if (mViewItem[i] != null) { mViewItem[i].setTranslationX(-offsetX, mScale); - slideViewBack(mViewItem[i].getView()); + slideViewBack(mViewItem[i]); } } } else { @@ -1454,7 +1480,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { for (int i = 1; i <= insertedItem; i++) { if (mViewItem[i] != null) { mViewItem[i].setTranslationX(offsetX, mScale); - slideViewBack(mViewItem[i].getView()); + slideViewBack(mViewItem[i]); mViewItem[i - 1] = mViewItem[i]; } } @@ -1711,6 +1737,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { private ValueAnimator mZoomAnimator; private boolean mHasNewScale; private float mNewScale; + private boolean mGeometryUpdateForced; private final Scroller mScroller; private boolean mHasNewPosition; @@ -1736,6 +1763,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mHasNewPosition = false; mCanStopScroll = true; mHasNewScale = false; + mGeometryUpdateForced = false; mScaleAnimator = new ValueAnimator(); mScaleAnimator.addUpdateListener(MyController.this); @@ -1753,14 +1781,20 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { return mScaleAnimator.isRunning(); } + void forceGeometryUpdate() { + mGeometryUpdateForced = true; + } + boolean hasNewGeometry() { + boolean forceNewGeometry = mGeometryUpdateForced; + mGeometryUpdateForced = false; mHasNewPosition = mScroller.computeScrollOffset(); if (!mHasNewPosition) { mCanStopScroll = true; } // If the position is locked, then we always return true to force // the position value to use the locked value. - return (mHasNewPosition || mHasNewScale); + return (mHasNewPosition || mHasNewScale || forceNewGeometry); } /** -- cgit v1.2.3