diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index d79832b..9f9f1b6 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 @@
         }
     }
 
+    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 5d3c5c0..d531f4a 100644
--- a/src/com/android/camera/CameraScreenNail.java
+++ b/src/com/android/camera/CameraScreenNail.java
@@ -90,6 +90,8 @@
         }
     };
     private DrawClient mDraw = mDefaultDraw;
+    private float mAlpha = 1f;
+    private Runnable mOnFrameDrawnListener;
 
     public interface Listener {
         void requestRender();
@@ -338,6 +340,12 @@
             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 @@
                     directDraw(canvas, x, y, width, height);
                 }
             }
+            canvas.setAlpha(oldAlpha);
             callbackIfNeeded();
         } // mLock
     }
@@ -494,4 +503,23 @@
             }
         }
     }
+
+    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();
+        }
+    }
 }
