summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2013-09-12 14:49:48 -0700
committerAngus Kong <shkong@google.com>2013-09-12 18:34:31 -0700
commitedbba628dc2e31057b304c6a431f44dbca125891 (patch)
treeb768343ed08a178c147d649f0ae822fc30bf960d
parentd1b0801a2e7f80c5ac047dded1edd0d3806f1e86 (diff)
downloadandroid_packages_apps_Snap-edbba628dc2e31057b304c6a431f44dbca125891.tar.gz
android_packages_apps_Snap-edbba628dc2e31057b304c6a431f44dbca125891.tar.bz2
android_packages_apps_Snap-edbba628dc2e31057b304c6a431f44dbca125891.zip
Avoid flickering after swipe to delete.
bug:10624385 Change-Id: Id4d65a391b2d13a5d6cc08ae9c1b787610c94c46
-rw-r--r--src/com/android/camera/ui/FilmStripView.java52
1 files changed, 43 insertions, 9 deletions
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);
}
/**