diff options
author | John Reck <jreck@google.com> | 2012-11-07 13:38:35 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2013-01-31 17:22:08 -0800 |
commit | e319aeabdc825f221df5af8a6ec080c6f5d41a94 (patch) | |
tree | 9baedfa5105727310fbe59edc65c3e8a0ab8f2a5 /src | |
parent | 9beac537774310fc435bc513ba25a8230b14f0e4 (diff) | |
download | android_packages_apps_Snap-e319aeabdc825f221df5af8a6ec080c6f5d41a94.tar.gz android_packages_apps_Snap-e319aeabdc825f221df5af8a6ec080c6f5d41a94.tar.bz2 android_packages_apps_Snap-e319aeabdc825f221df5af8a6ec080c6f5d41a94.zip |
Animate between photo modules
Change-Id: I20f0d470a14bb41757788897c1c5e7ea42a7426d
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 87 | ||||
-rw-r--r-- | src/com/android/camera/CameraScreenNail.java | 28 |
2 files changed, 95 insertions, 20 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index d79832b7d..9f9f1b652 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -16,6 +16,9 @@ package com.android.camera; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -132,34 +135,78 @@ public class CameraActivity extends ActivityBase } } + private ObjectAnimator mCameraSwitchAnimator; + @Override - public void onCameraSelected(int i) { + public void onCameraSelected(final int i) { if (mPaused) return; if (i != mCurrentModuleIndex) { mPaused = true; - boolean canReuse = canReuseScreenNail(); - CameraHolder.instance().keep(); - closeModule(mCurrentModule); - mCurrentModuleIndex = i; - switch (i) { - case VIDEO_MODULE_INDEX: - mCurrentModule = new VideoModule(); - break; - case PHOTO_MODULE_INDEX: - mCurrentModule = new PhotoModule(); - break; - case PANORAMA_MODULE_INDEX: - mCurrentModule = new PanoramaModule(); - break; - case LIGHTCYCLE_MODULE_INDEX: - mCurrentModule = LightCycleHelper.createPanoramaModule(); - break; + CameraScreenNail screenNail = getCameraScreenNail(); + if (screenNail != null) { + if (mCameraSwitchAnimator != null && mCameraSwitchAnimator.isRunning()) { + mCameraSwitchAnimator.cancel(); + } + mCameraSwitchAnimator = ObjectAnimator.ofFloat( + screenNail, "alpha", screenNail.getAlpha(), 0f); + mCameraSwitchAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + doChangeCamera(i); + } + }); + mCameraSwitchAnimator.start(); + } else { + doChangeCamera(i); } - openModule(mCurrentModule, canReuse); - mCurrentModule.onOrientationChanged(mLastRawOrientation); } } + private void doChangeCamera(int i) { + boolean canReuse = canReuseScreenNail(); + CameraHolder.instance().keep(); + closeModule(mCurrentModule); + mCurrentModuleIndex = i; + switch (i) { + case VIDEO_MODULE_INDEX: + mCurrentModule = new VideoModule(); + break; + case PHOTO_MODULE_INDEX: + mCurrentModule = new PhotoModule(); + break; + case PANORAMA_MODULE_INDEX: + mCurrentModule = new PanoramaModule(); + break; + case LIGHTCYCLE_MODULE_INDEX: + mCurrentModule = LightCycleHelper.createPanoramaModule(); + break; + } + openModule(mCurrentModule, canReuse); + mCurrentModule.onOrientationChanged(mLastRawOrientation); + getCameraScreenNail().setAlpha(0f); + getCameraScreenNail().setOnFrameDrawnOneShot(mOnFrameDrawn); + } + + private Runnable mOnFrameDrawn = new Runnable() { + + @Override + public void run() { + runOnUiThread(mFadeInCameraScreenNail); + } + }; + + private Runnable mFadeInCameraScreenNail = new Runnable() { + + @Override + public void run() { + mCameraSwitchAnimator = ObjectAnimator.ofFloat( + getCameraScreenNail(), "alpha", 0f, 1f); + mCameraSwitchAnimator.setStartDelay(50); + mCameraSwitchAnimator.start(); + } + }; + @Override public void onShowSwitcherPopup() { mCurrentModule.onShowSwitcherPopup(); diff --git a/src/com/android/camera/CameraScreenNail.java b/src/com/android/camera/CameraScreenNail.java index 5d3c5c092..d531f4adf 100644 --- a/src/com/android/camera/CameraScreenNail.java +++ b/src/com/android/camera/CameraScreenNail.java @@ -90,6 +90,8 @@ public class CameraScreenNail extends SurfaceTextureScreenNail { } }; private DrawClient mDraw = mDefaultDraw; + private float mAlpha = 1f; + private Runnable mOnFrameDrawnListener; public interface Listener { void requestRender(); @@ -338,6 +340,12 @@ public class CameraScreenNail extends SurfaceTextureScreenNail { if (mDraw.requiresSurfaceTexture() && (surfaceTexture == null || !mFirstFrameArrived)) { return; } + if (mOnFrameDrawnListener != null) { + mOnFrameDrawnListener.run(); + mOnFrameDrawnListener = null; + } + float oldAlpha = canvas.getAlpha(); + canvas.setAlpha(mAlpha); switch (mAnimState) { case ANIM_NONE: @@ -393,6 +401,7 @@ public class CameraScreenNail extends SurfaceTextureScreenNail { directDraw(canvas, x, y, width, height); } } + canvas.setAlpha(oldAlpha); callbackIfNeeded(); } // mLock } @@ -494,4 +503,23 @@ public class CameraScreenNail extends SurfaceTextureScreenNail { } } } + + public void setOnFrameDrawnOneShot(Runnable run) { + synchronized (mLock) { + mOnFrameDrawnListener = run; + } + } + + public float getAlpha() { + synchronized (mLock) { + return mAlpha; + } + } + + public void setAlpha(float alpha) { + synchronized (mLock) { + mAlpha = alpha; + mListener.requestRender(); + } + } } |