diff options
author | Spike Sprague <spikuru@google.com> | 2014-09-08 10:43:04 -0700 |
---|---|---|
committer | The Android Automerger <android-build@google.com> | 2014-09-18 13:51:40 -0700 |
commit | d74c99e0936fe71cd657a9ce114bb5d1e5b3fcae (patch) | |
tree | 310c934fc3178141a9c5614a89cab3e292984188 | |
parent | d5aea8d4def705c63319a4c20349fac43b2c4b20 (diff) | |
download | android_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.java | 112 | ||||
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 21 | ||||
-rw-r--r-- | src/com/android/camera/VideoModule.java | 10 | ||||
-rw-r--r-- | src/com/android/camera/app/CameraAppUI.java | 21 | ||||
-rw-r--r-- | src/com/android/camera/ui/ModeIconView.java | 28 | ||||
-rw-r--r-- | src/com/android/camera/ui/ModeListView.java | 235 | ||||
-rw-r--r-- | src/com/android/camera/ui/ModeSelectorItem.java | 16 |
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 |