summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSpike Sprague <spikuru@google.com>2014-09-08 10:43:04 -0700
committerThe Android Automerger <android-build@google.com>2014-09-18 13:51:40 -0700
commitd74c99e0936fe71cd657a9ce114bb5d1e5b3fcae (patch)
tree310c934fc3178141a9c5614a89cab3e292984188
parentd5aea8d4def705c63319a4c20349fac43b2c4b20 (diff)
downloadandroid_packages_apps_Camera2-d74c99e0936fe71cd657a9ce114bb5d1e5b3fcae.tar.gz
android_packages_apps_Camera2-d74c99e0936fe71cd657a9ce114bb5d1e5b3fcae.tar.bz2
android_packages_apps_Camera2-d74c99e0936fe71cd657a9ce114bb5d1e5b3fcae.zip
mode switch jank fixes
puts many ValueAnimators news into initialize methods changes startPreview() calls to startPreviewWithCallback() puts MultToggleImageButton's bitmap combine into an AsyncTask bug: 17070332 Change-Id: Idea6396264588b345ed27b9f96f9434ff3e7e77c
-rw-r--r--src/com/android/camera/MultiToggleImageButton.java112
-rw-r--r--src/com/android/camera/PhotoModule.java21
-rw-r--r--src/com/android/camera/VideoModule.java10
-rw-r--r--src/com/android/camera/app/CameraAppUI.java21
-rw-r--r--src/com/android/camera/ui/ModeIconView.java28
-rw-r--r--src/com/android/camera/ui/ModeListView.java235
-rw-r--r--src/com/android/camera/ui/ModeSelectorItem.java16
7 files changed, 217 insertions, 226 deletions
diff --git a/src/com/android/camera/MultiToggleImageButton.java b/src/com/android/camera/MultiToggleImageButton.java
index b36cb3ca0..8e08a5615 100644
--- a/src/com/android/camera/MultiToggleImageButton.java
+++ b/src/com/android/camera/MultiToggleImageButton.java
@@ -18,6 +18,7 @@ package com.android.camera;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
@@ -25,6 +26,7 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
@@ -58,7 +60,7 @@ public class MultiToggleImageButton extends ImageButton {
public static final int ANIM_DIRECTION_VERTICAL = 0;
public static final int ANIM_DIRECTION_HORIZONTAL = 1;
- private static final int AINM_DURATION_MS = 250;
+ private static final int ANIM_DURATION_MS = 250;
private static final int UNSET = -1;
private OnStateChangeListener mOnStateChangeListener;
@@ -69,6 +71,8 @@ public class MultiToggleImageButton extends ImageButton {
private boolean mClickEnabled = true;
private int mParentSize;
private int mAnimDirection;
+ private Matrix mMatrix = new Matrix();
+ private ValueAnimator mAnimator;
public MultiToggleImageButton(Context context) {
super(context);
@@ -123,8 +127,7 @@ public class MultiToggleImageButton extends ImageButton {
* @param callListener should the state change listener be called?
*/
public void setState(final int state, final boolean callListener) {
- // TODO: animate button transitions, b/17414652
- setStateInternal(state, callListener);
+ setStateAnimatedInternal(state, callListener);
}
/**
@@ -143,60 +146,47 @@ public class MultiToggleImageButton extends ImageButton {
return;
}
- Bitmap bitmap = combine(mState, state);
- if (bitmap == null) {
- setStateInternal(state, callListener);
- return;
- }
-
- setImageBitmap(bitmap);
- final Matrix matrix = new Matrix();
-
- int offset;
- if (mAnimDirection == ANIM_DIRECTION_VERTICAL) {
- offset = (mParentSize+getHeight())/2;
- } else if (mAnimDirection == ANIM_DIRECTION_HORIZONTAL) {
- offset = (mParentSize+getWidth())/2;
- } else {
- return;
- }
-
- ValueAnimator animator = ValueAnimator.ofFloat(-offset, 0.0f);
- animator.setDuration(AINM_DURATION_MS);
- animator.setInterpolator(Gusterpolator.INSTANCE);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- matrix.reset();
- if (mAnimDirection == ANIM_DIRECTION_VERTICAL) {
- matrix.setTranslate(0.0f, (Float) animation.getAnimatedValue());
- } else if (mAnimDirection == ANIM_DIRECTION_HORIZONTAL) {
- matrix.setTranslate((Float) animation.getAnimatedValue(), 0.0f);
- }
-
- setImageMatrix(matrix);
- invalidate();
- }
- });
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- setClickEnabled(false);
- }
-
+ new AsyncTask<Integer, Void, Bitmap>() {
@Override
- public void onAnimationEnd(Animator animation) {
- setStateInternal(state, callListener);
- setClickEnabled(true);
+ protected Bitmap doInBackground(Integer... params) {
+ return combine(params[0], params[1]);
}
@Override
- public void onAnimationCancel(Animator animation) {
- setStateInternal(state, callListener);
- setClickEnabled(true);
+ protected void onPostExecute(Bitmap bitmap) {
+ if (bitmap == null) {
+ setStateInternal(state, callListener);
+ } else {
+ setImageBitmap(bitmap);
+
+ int offset;
+ if (mAnimDirection == ANIM_DIRECTION_VERTICAL) {
+ offset = (mParentSize+getHeight())/2;
+ } else if (mAnimDirection == ANIM_DIRECTION_HORIZONTAL) {
+ offset = (mParentSize+getWidth())/2;
+ } else {
+ return;
+ }
+
+ mAnimator.setFloatValues(-offset, 0.0f);
+ AnimatorSet s = new AnimatorSet();
+ s.play(mAnimator);
+ s.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ setClickEnabled(false);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ setStateInternal(state, callListener);
+ setClickEnabled(true);
+ }
+ });
+ s.start();
+ }
}
- });
- animator.start();
+ }.execute(mState, state);
}
/**
@@ -251,6 +241,24 @@ public class MultiToggleImageButton extends ImageButton {
}
});
setScaleType(ImageView.ScaleType.MATRIX);
+
+ mAnimator = ValueAnimator.ofFloat(0.0f, 0.0f);
+ mAnimator.setDuration(ANIM_DURATION_MS);
+ mAnimator.setInterpolator(Gusterpolator.INSTANCE);
+ mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mMatrix.reset();
+ if (mAnimDirection == ANIM_DIRECTION_VERTICAL) {
+ mMatrix.setTranslate(0.0f, (Float) animation.getAnimatedValue());
+ } else if (mAnimDirection == ANIM_DIRECTION_HORIZONTAL) {
+ mMatrix.setTranslate((Float) animation.getAnimatedValue(), 0.0f);
+ }
+
+ setImageMatrix(mMatrix);
+ invalidate();
+ }
+ });
}
private void parseAttributes(Context context, AttributeSet attrs) {
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 8865a80be..cbaa01b99 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -75,6 +75,7 @@ import com.android.camera.util.SessionStatsCollector;
import com.android.camera.util.UsageStatistics;
import com.android.camera.widget.AspectRatioSelector;
import com.android.camera2.R;
+import com.android.ex.camera2.portability.CameraAgent;
import com.android.ex.camera2.portability.CameraAgent.CameraAFCallback;
import com.android.ex.camera2.portability.CameraAgent.CameraAFMoveCallback;
import com.android.ex.camera2.portability.CameraAgent.CameraPictureCallback;
@@ -1991,14 +1992,18 @@ public class PhotoModule
mCameraDevice.setPreviewTexture(mActivity.getCameraAppUI().getSurfaceTexture());
Log.i(TAG, "startPreview");
- mCameraDevice.startPreview();
-
- mFocusManager.onPreviewStarted();
- onPreviewStarted();
- SessionStatsCollector.instance().previewActive(true);
- if (mSnapshotOnIdle) {
- mHandler.post(mDoSnapRunnable);
- }
+ mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
+ new CameraAgent.CameraStartPreviewCallback() {
+ @Override
+ public void onPreviewStarted() {
+ mFocusManager.onPreviewStarted();
+ PhotoModule.this.onPreviewStarted();
+ SessionStatsCollector.instance().previewActive(true);
+ if (mSnapshotOnIdle) {
+ mHandler.post(mDoSnapRunnable);
+ }
+ }
+ });
} finally {
mStartPreviewLock = false;
}
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index b71b30fd1..d4dcdad5d 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -37,6 +37,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.SystemClock;
@@ -917,9 +918,14 @@ public class VideoModule extends CameraModule
}
try {
mCameraDevice.setPreviewTexture(surfaceTexture);
- mCameraDevice.startPreview();
+ mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
+ new CameraAgent.CameraStartPreviewCallback() {
+ @Override
+ public void onPreviewStarted() {
+ VideoModule.this.onPreviewStarted();
+ }
+ });
mPreviewing = true;
- onPreviewStarted();
} catch (Throwable ex) {
closeCamera();
throw new RuntimeException("startPreview failed", ex);
diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java
index 30b654c59..04d61051d 100644
--- a/src/com/android/camera/app/CameraAppUI.java
+++ b/src/com/android/camera/app/CameraAppUI.java
@@ -945,7 +945,6 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
mController.getQuickSwitchToModuleId(currentModuleIndex);
if (currentModuleIndex != moduleToTransitionTo) {
mAppRootView.redirectTouchEventsTo(mModeTransitionView);
-
int shadeColorId = R.color.mode_cover_default_color;
int iconRes = CameraUtil.getCameraModeCoverIconResId(moduleToTransitionTo,
mController.getAndroidContext());
@@ -966,11 +965,6 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
}
}
};
- if (mSwipeState == SWIPE_UP) {
- mModeTransitionView.prepareToPullUpShade(shadeColorId, iconRes, listener);
- } else {
- mModeTransitionView.prepareToPullDownShade(shadeColorId, iconRes, listener);
- }
}
} else if (swipeState == SWIPE_LEFT) {
// Pass the touch sequence to filmstrip layout.
@@ -1355,7 +1349,6 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
Log.v(TAG, "onNewPreviewFrame");
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.FIRST_PREVIEW_FRAME);
hideModeCover();
- mModeCoverState = COVER_HIDDEN;
}
/**
@@ -1429,13 +1422,6 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
}
private void updateModeSpecificUIColors() {
- // set up UI colors to match the current mode
- /*
- int colorId = CameraUtil.getCameraThemeColorId(mController.getCurrentModuleIndex(),
- mController.getAndroidContext());
- int pressedColor = mController.getAndroidContext().getResources().getColor(colorId);
- setBottomBarPressedColor(pressedColor);
- */
setBottomBarColorsForModeIndex(mController.getCurrentModuleIndex());
}
@@ -1582,14 +1568,13 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener,
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
mSurface = surface;
+ if (mPreviewStatusListener != null) {
+ mPreviewStatusListener.onSurfaceTextureUpdated(surface);
+ }
if (mModeCoverState == COVER_WILL_HIDE_AT_NEXT_TEXTURE_UPDATE) {
Log.v(TAG, "hiding cover via onSurfaceTextureUpdated");
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.FIRST_PREVIEW_FRAME);
hideModeCover();
- mModeCoverState = COVER_HIDDEN;
- }
- if (mPreviewStatusListener != null) {
- mPreviewStatusListener.onSurfaceTextureUpdated(surface);
}
}
diff --git a/src/com/android/camera/ui/ModeIconView.java b/src/com/android/camera/ui/ModeIconView.java
index e7e2701c6..a978bc75d 100644
--- a/src/com/android/camera/ui/ModeIconView.java
+++ b/src/com/android/camera/ui/ModeIconView.java
@@ -34,16 +34,13 @@ import com.android.camera2.R;
* whereas a state list drawable would require a different drawable for each state.
*/
public class ModeIconView extends View {
- private boolean mHighlightIsOn = false;
private final GradientDrawable mBackground;
- private final GradientDrawable mHoverDrawable;
private final int mIconBackgroundSize;
private int mHighlightColor;
private final int mBackgroundDefaultColor;
private final int mIconDrawableSize;
private Drawable mIconDrawable = null;
- private boolean mSelected = false;
public ModeIconView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -53,13 +50,8 @@ public class ModeIconView extends View {
mBackground = (GradientDrawable) getResources()
.getDrawable(R.drawable.mode_icon_background).mutate();
mBackground.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize);
- mHoverDrawable = (GradientDrawable) getResources()
- .getDrawable(R.drawable.mode_icon_background).mutate();
- mHoverDrawable.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize);
mIconDrawableSize = getResources().getDimensionPixelSize(
R.dimen.mode_selector_icon_drawable_size);
-
- mHoverDrawable.setColor(getResources().getColor(R.color.mode_icon_hover_highlight));
}
/**
@@ -83,11 +75,7 @@ public class ModeIconView extends View {
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
- if (mHighlightIsOn && !mSelected) {
- mHoverDrawable.draw(canvas);
- } else {
- mBackground.draw(canvas);
- }
+ mBackground.draw(canvas);
if (mIconDrawable != null) {
mIconDrawable.draw(canvas);
}
@@ -117,24 +105,10 @@ public class ModeIconView extends View {
public void setSelected(boolean selected) {
if (selected) {
mBackground.setColor(mHighlightColor);
- mHighlightIsOn = false;
} else {
mBackground.setColor(mBackgroundDefaultColor);
}
- mSelected = selected;
- invalidate();
- }
-
- /**
- * This gets called when the highlighted state is changed. When highlighted,
- * a ring shaped drawable of a solid pre-defined color will be drawn on top
- * of the background drawable to indicate highlight state.
- *
- * @param highlighted true when highlighted, false otherwise.
- */
- public void setHighlighted(boolean highlighted) {
- mHighlightIsOn = highlighted;
invalidate();
}
diff --git a/src/com/android/camera/ui/ModeListView.java b/src/com/android/camera/ui/ModeListView.java
index 78ab9863c..41bd3d672 100644
--- a/src/com/android/camera/ui/ModeListView.java
+++ b/src/com/android/camera/ui/ModeListView.java
@@ -826,12 +826,11 @@ public class ModeListView extends FrameLayout
* be revealed through a pinhole animation. After all the animations finish,
* mode list will transition into fully hidden state.
*/
- private class SelectedState extends ModeListState {
+ private class SelectedState extends ModeListState {
public SelectedState(ModeSelectorItem selectedItem) {
final int modeId = selectedItem.getModeId();
// Un-highlight all the modes.
for (int i = 0; i < mModeSelectorItems.length; i++) {
- mModeSelectorItems[i].setHighlighted(false);
mModeSelectorItems[i].setSelected(false);
}
@@ -1501,7 +1500,6 @@ public class ModeListView extends FrameLayout
if (mModeSelectorItems != null) {
// When becoming invisible/gone after initializing mode selector items.
for (int i = 0; i < mModeSelectorItems.length; i++) {
- mModeSelectorItems[i].setHighlighted(false);
mModeSelectorItems[i].setSelected(false);
}
}
@@ -1906,6 +1904,8 @@ public class ModeListView extends FrameLayout
private int mPeepHoleCenterY = UNSET;
private float mRadius = 0f;
private ValueAnimator mPeepHoleAnimator;
+ private ValueAnimator mFadeOutAlphaAnimator;
+ private ValueAnimator mRevealAlphaAnimator;
private Bitmap mBackground;
private Bitmap mBackgroundOverlay;
@@ -1923,6 +1923,107 @@ public class ModeListView extends FrameLayout
mCoverPaint.setColor(0);
mCoverPaint.setAlpha(0);
+
+ setupAnimators();
+ }
+
+ private void setupAnimators() {
+ mFadeOutAlphaAnimator = ValueAnimator.ofInt(0, 255);
+ mFadeOutAlphaAnimator.setDuration(100);
+ mFadeOutAlphaAnimator.setInterpolator(Gusterpolator.INSTANCE);
+ mFadeOutAlphaAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mCoverPaint.setAlpha((Integer) animation.getAnimatedValue());
+ invalidate();
+ }
+ });
+ mFadeOutAlphaAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ // Sets a HW layer on the view for the animation.
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // Sets the layer type back to NONE as a workaround for b/12594617.
+ setLayerType(LAYER_TYPE_NONE, null);
+ }
+ });
+
+ /////////////////
+
+ mRevealAlphaAnimator = ValueAnimator.ofInt(255, 0);
+ mRevealAlphaAnimator.setDuration(PEEP_HOLE_ANIMATION_DURATION_MS);
+ mRevealAlphaAnimator.setInterpolator(Gusterpolator.INSTANCE);
+ mRevealAlphaAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int alpha = (Integer) animation.getAnimatedValue();
+ mCirclePaint.setAlpha(alpha);
+ mCoverPaint.setAlpha(alpha);
+ }
+ });
+ mRevealAlphaAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ // Sets a HW layer on the view for the animation.
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // Sets the layer type back to NONE as a workaround for b/12594617.
+ setLayerType(LAYER_TYPE_NONE, null);
+ }
+ });
+
+ ////////////////
+
+ int horizontalDistanceToFarEdge = Math.max(mPeepHoleCenterX, mWidth - mPeepHoleCenterX);
+ int verticalDistanceToFarEdge = Math.max(mPeepHoleCenterY, mHeight - mPeepHoleCenterY);
+ int endRadius = (int) (Math.sqrt(horizontalDistanceToFarEdge * horizontalDistanceToFarEdge
+ + verticalDistanceToFarEdge * verticalDistanceToFarEdge));
+ int startRadius = getResources().getDimensionPixelSize(
+ R.dimen.mode_selector_icon_block_width) / 2;
+
+ mPeepHoleAnimator = ValueAnimator.ofFloat(startRadius, endRadius);
+ mPeepHoleAnimator.setDuration(PEEP_HOLE_ANIMATION_DURATION_MS);
+ mPeepHoleAnimator.setInterpolator(Gusterpolator.INSTANCE);
+ mPeepHoleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ // Modify mask by enlarging the hole
+ mRadius = (Float) mPeepHoleAnimator.getAnimatedValue();
+ invalidate();
+ }
+ });
+ mPeepHoleAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ // Sets a HW layer on the view for the animation.
+ setLayerType(LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // Sets the layer type back to NONE as a workaround for b/12594617.
+ setLayerType(LAYER_TYPE_NONE, null);
+ }
+ });
+
+ ////////////////
+ int size = getContext().getResources()
+ .getDimensionPixelSize(R.dimen.mode_selector_icon_block_width);
+ mCircleDrawable = new TouchCircleDrawable(getContext().getResources());
+ mCircleDrawable.setSize(size, size);
+ mCircleDrawable.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ invalidate();
+ }
+ });
}
@Override
@@ -1936,6 +2037,16 @@ public class ModeListView extends FrameLayout
return true;
}
+ @Override
+ public void drawForeground(Canvas canvas) {
+ // Draw the circle in clear mode
+ if (mPeepHoleAnimator != null) {
+ // Draw a transparent circle using clear mode
+ canvas.drawCircle(mPeepHoleCenterX, mPeepHoleCenterY, mRadius, mMaskPaint);
+ canvas.drawCircle(mPeepHoleCenterX, mPeepHoleCenterY, mRadius, mCirclePaint);
+ }
+ }
+
public void setAnimationStartingPosition(int x, int y) {
mPeepHoleCenterX = x;
mPeepHoleCenterY = y;
@@ -1978,16 +2089,6 @@ public class ModeListView extends FrameLayout
}
@Override
- public void drawForeground(Canvas canvas) {
- // Draw the circle in clear mode
- if (mPeepHoleAnimator != null) {
- // Draw a transparent circle using clear mode
- canvas.drawCircle(mPeepHoleCenterX, mPeepHoleCenterY, mRadius, mMaskPaint);
- canvas.drawCircle(mPeepHoleCenterX, mPeepHoleCenterY, mRadius, mCirclePaint);
- }
- }
-
- @Override
public boolean shouldDrawSuper() {
// No need to draw super when mBackgroundOverlay is being drawn, as
// background overlay already contains what's drawn in super.
@@ -2000,36 +2101,11 @@ public class ModeListView extends FrameLayout
mCoverPaint.setColor(0);
mCoverPaint.setAlpha(0);
- ValueAnimator alphaAnimator = ValueAnimator.ofInt(0, 255);
- alphaAnimator.setDuration(100);
- alphaAnimator.setInterpolator(Gusterpolator.INSTANCE);
- alphaAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- mCoverPaint.setAlpha((Integer) animation.getAnimatedValue());
- invalidate();
- }
- });
- if (listener != null) {
- alphaAnimator.addListener(listener);
- }
-
- int size = getContext().getResources()
- .getDimensionPixelSize(R.dimen.mode_selector_icon_block_width);
- mCircleDrawable = new TouchCircleDrawable(getContext().getResources());
mCircleDrawable.setIconDrawable(
selectedItem.getIcon().getIconDrawableClone(),
selectedItem.getIcon().getIconDrawableSize());
- mCircleDrawable.setSize(size, size);
mCircleDrawable.setCenter(new Point(x, y));
mCircleDrawable.setColor(selectedItem.getHighlightColor());
- mCircleDrawable.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- invalidate();
- }
- });
-
mCircleDrawable.setAnimatorListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -2046,8 +2122,16 @@ public class ModeListView extends FrameLayout
});
}
});
+
+ // add fade out animator to a set, so we can freely add
+ // the listener without having to worry about listener dupes
+ AnimatorSet s = new AnimatorSet();
+ s.play(mFadeOutAlphaAnimator);
+ if (listener != null) {
+ s.addListener(listener);
+ }
mCircleDrawable.animate();
- alphaAnimator.start();
+ s.start();
}
@Override
@@ -2060,73 +2144,18 @@ public class ModeListView extends FrameLayout
mPeepHoleCenterY = mHeight / 2;
}
- int horizontalDistanceToFarEdge = Math.max(mPeepHoleCenterX, mWidth - mPeepHoleCenterX);
- int verticalDistanceToFarEdge = Math.max(mPeepHoleCenterY, mHeight - mPeepHoleCenterY);
- int endRadius = (int) (Math.sqrt(horizontalDistanceToFarEdge * horizontalDistanceToFarEdge
- + verticalDistanceToFarEdge * verticalDistanceToFarEdge));
- int startRadius = getResources().getDimensionPixelSize(
- R.dimen.mode_selector_icon_block_width) / 2;
-
- mPeepHoleAnimator = ValueAnimator.ofFloat(startRadius, endRadius);
- mPeepHoleAnimator.setDuration(PEEP_HOLE_ANIMATION_DURATION_MS);
- mPeepHoleAnimator.setInterpolator(Gusterpolator.INSTANCE);
- mPeepHoleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- // Modify mask by enlarging the hole
- mRadius = (Float) mPeepHoleAnimator.getAnimatedValue();
- invalidate();
- }
- });
-
- if (listener != null) {
- mPeepHoleAnimator.addListener(listener);
- }
-
- mPeepHoleAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- // Sets a HW layer on the view for the animation.
- setLayerType(LAYER_TYPE_HARDWARE, null);
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- // Sets the layer type back to NONE as a workaround for b/12594617.
- setLayerType(LAYER_TYPE_NONE, null);
- }
- });
-
mCirclePaint.setAlpha(255);
mCoverPaint.setAlpha(255);
- ValueAnimator alphaAnimator = ValueAnimator.ofInt(255, 0);
- alphaAnimator.setDuration(PEEP_HOLE_ANIMATION_DURATION_MS);
- alphaAnimator.setInterpolator(Gusterpolator.INSTANCE);
- alphaAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- int alpha = (Integer) animation.getAnimatedValue();
- mCirclePaint.setAlpha(alpha);
- mCoverPaint.setAlpha(alpha);
- }
- });
- alphaAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- // Sets a HW layer on the view for the animation.
- setLayerType(LAYER_TYPE_HARDWARE, null);
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- // Sets the layer type back to NONE as a workaround for b/12594617.
- setLayerType(LAYER_TYPE_NONE, null);
- }
- });
-
-
- mPeepHoleAnimator.start();
- alphaAnimator.start();
+ // add peephole and reveal animators to a set, so we can
+ // freely add the listener without having to worry about
+ // listener dupes
+ AnimatorSet s = new AnimatorSet();
+ s.play(mPeepHoleAnimator).with(mRevealAlphaAnimator);
+ if (listener != null) {
+ s.addListener(listener);
+ }
+ s.start();
}
@Override
diff --git a/src/com/android/camera/ui/ModeSelectorItem.java b/src/com/android/camera/ui/ModeSelectorItem.java
index 8b535b4c5..6ce70fcc5 100644
--- a/src/com/android/camera/ui/ModeSelectorItem.java
+++ b/src/com/android/camera/ui/ModeSelectorItem.java
@@ -42,11 +42,6 @@ import com.android.camera2.R;
* we display the view partially.
*/
class ModeSelectorItem extends FrameLayout {
- // Drawing modes that defines how the TextView should be drawn when there
- // is not enough space to draw the whole TextView.
- public static final int FLY_IN = 1;
- public static final int FLY_OUT = 2;
-
private TextView mText;
private ModeIconView mIcon;
private int mVisibleWidth = 0;
@@ -99,10 +94,6 @@ class ModeSelectorItem extends FrameLayout {
mListener = listener;
}
- public void setHighlighted(boolean highlighted) {
- mIcon.setHighlighted(highlighted);
- }
-
@Override
public void setSelected(boolean selected) {
mIcon.setSelected(selected);
@@ -121,13 +112,6 @@ class ModeSelectorItem extends FrameLayout {
return false;
}
- @Override
- public void setPressed(boolean pressed) {
- super.setPressed(pressed);
- // When pressed state changes, highlight the icon.
- mIcon.setHighlighted(pressed);
- }
-
/**
* When swiping in, we truncate the end of the item if the visible width
* is not enough to show the whole item. When swiping out, we truncate the