Skip to content

Commit

Permalink
Animate between camera modules
Browse files Browse the repository at this point in the history
 Bug: 7265781

Change-Id: Id226392fc1b14ebe5374d1952c830c960c5588d1
  • Loading branch information
jreck committed Nov 7, 2012
1 parent 44fc883 commit 3e40e8d
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 21 deletions.
88 changes: 68 additions & 20 deletions src/com/android/camera/CameraActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -135,34 +138,79 @@ public void onOrientationChanged(int orientation) {
}
}

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(mOrientation);

}
}

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(mOrientation);
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();
Expand Down
30 changes: 29 additions & 1 deletion src/com/android/camera/CameraScreenNail.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ public class CameraScreenNail extends SurfaceTextureScreenNail {
private float mScaleX = 1f, mScaleY = 1f;
private boolean mFullScreen;
private boolean mEnableAspectRatioClamping = false;
private float mAlpha = 1f;
private Runnable mOnFrameDrawnListener;

public interface Listener {
void requestRender();
Expand Down Expand Up @@ -147,7 +149,7 @@ public void setSize(int w, int h) {
* Tells the ScreenNail to override the default aspect ratio scaling
* and instead perform custom scaling to basically do a centerCrop instead
* of the default centerInside
*
*
* Note that calls to setSize will disable this
*/
public void enableAspectRatioClamping() {
Expand Down Expand Up @@ -290,6 +292,12 @@ public void draw(GLCanvas canvas, int x, int y, int width, int height) {
if (!mVisible) mVisible = true;
SurfaceTexture surfaceTexture = getSurfaceTexture();
if (surfaceTexture == null || !mFirstFrameArrived) return;
if (mOnFrameDrawnListener != null) {
mOnFrameDrawnListener.run();
mOnFrameDrawnListener = null;
}
float oldAlpha = canvas.getAlpha();
canvas.setAlpha(mAlpha);

switch (mAnimState) {
case ANIM_NONE:
Expand Down Expand Up @@ -345,6 +353,7 @@ public void draw(GLCanvas canvas, int x, int y, int width, int height) {
super.draw(canvas, x, y, width, height);
}
}
canvas.setAlpha(oldAlpha);
callbackIfNeeded();
} // mLock
}
Expand Down Expand Up @@ -413,4 +422,23 @@ public void setOneTimeOnFrameDrawnListener(OnFrameDrawnListener l) {
mOneTimeFrameDrawnListener = l;
}
}

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();
}
}
}

0 comments on commit 3e40e8d

Please sign in to comment.