diff options
author | Owen Lin <owenlin@google.com> | 2009-12-04 11:48:21 +0800 |
---|---|---|
committer | Owen Lin <owenlin@google.com> | 2009-12-04 18:58:06 +0800 |
commit | ff58fb6921ccb7398ad30c8cec604c38c76be4fc (patch) | |
tree | 981860f52de7b9ec8cc60b354b4c72e6f55a9d75 /src/com | |
parent | ad9df588053caf70976de9dd29b612fdf698ee4d (diff) | |
download | LegacyCamera-ff58fb6921ccb7398ad30c8cec604c38c76be4fc.zip LegacyCamera-ff58fb6921ccb7398ad30c8cec604c38c76be4fc.tar.gz LegacyCamera-ff58fb6921ccb7398ad30c8cec604c38c76be4fc.tar.bz2 |
Use icon to indicate the orientation of the taken photos.
Change-Id: I144e2dd590e98942763fc6e243da3e17cb25d88d
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/camera/Camera.java | 27 | ||||
-rw-r--r-- | src/com/android/camera/ImageManager.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/RotateImageView.java | 104 |
3 files changed, 123 insertions, 12 deletions
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index a82a83e..6fea12a 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -262,15 +262,18 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, // Create orientation listenter. This should be done first because it // takes some time to get first orientation. - mOrientationListener = - new OrientationEventListener(Camera.this) { + mOrientationListener = new OrientationEventListener(Camera.this) { @Override public void onOrientationChanged(int orientation) { // We keep the last known orientation. So if the user // first orient the camera then point the camera to - // floor/sky, we still have the correct orientation. if (orientation != ORIENTATION_UNKNOWN) { + orientation += 90; + } + orientation = ImageManager.roundOrientation(orientation); + if (orientation != mLastOrientation) { mLastOrientation = orientation; + setOrientationIndicator(mLastOrientation); } } }; @@ -806,14 +809,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, mCaptureOnlyData = null; // Set rotation. - int orientation = mLastOrientation; - if (orientation != OrientationEventListener.ORIENTATION_UNKNOWN) { - orientation += 90; - } - orientation = ImageManager.roundOrientation(orientation); - Log.v(TAG, "mLastOrientation = " + mLastOrientation - + ", orientation = " + orientation); - mParameters.setRotation(orientation); + mParameters.setRotation(mLastOrientation); // Clear previous GPS location from the parameters. mParameters.removeGpsData(); @@ -992,6 +988,15 @@ public class Camera extends NoSearchActivity implements View.OnClickListener, removeUnsupportedIndicators(); } + private void setOrientationIndicator(int degree) { + ((RotateImageView) findViewById( + R.id.review_thumbnail)).setDegree(degree); + ((RotateImageView) findViewById( + R.id.camera_switch_icon)).setDegree(degree); + ((RotateImageView) findViewById( + R.id.video_switch_icon)).setDegree(degree); + } + private void removeUnsupportedIndicators() { if (mParameters.getSupportedFocusModes() == null) { mFocusIndicator.setVisibility(View.GONE); diff --git a/src/com/android/camera/ImageManager.java b/src/com/android/camera/ImageManager.java index 0a6fd2f..50884ba 100644 --- a/src/com/android/camera/ImageManager.java +++ b/src/com/android/camera/ImageManager.java @@ -41,6 +41,7 @@ import android.provider.DrmStore; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.util.Log; +import android.view.OrientationEventListener; import java.io.File; import java.io.FileNotFoundException; @@ -168,7 +169,8 @@ public class ImageManager { public static int roundOrientation(int orientationInput) { int orientation = orientationInput; - if (orientation == -1) { + + if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) { orientation = 0; } diff --git a/src/com/android/camera/RotateImageView.java b/src/com/android/camera/RotateImageView.java new file mode 100644 index 0000000..74152d4 --- /dev/null +++ b/src/com/android/camera/RotateImageView.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.animation.AnimationUtils; +import android.widget.ImageView; + +/** + * A @{code ImageView} which can rotate it's content. + */ +public class RotateImageView extends ImageView { + + @SuppressWarnings("unused") + private static final String TAG = "RotateImageView"; + + private static final int ANIMATION_SPEED = 180; // 180 deg/sec + + private int mCurrentDegree = 0; // [0, 359] + private int mStartDegree = 0; + private int mTargetDegree = 0; + + private boolean mClockwise = false; + + private long mAnimationStartTime = 0; + private long mAnimationEndTime = 0; + + public RotateImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setDegree(int degree) { + // make sure in the range of [0, 359] + degree = degree >= 0 ? degree % 360 : degree % 360 + 360; + if (degree == mTargetDegree) return; + + mTargetDegree = degree; + mStartDegree = mCurrentDegree; + mAnimationStartTime = AnimationUtils.currentAnimationTimeMillis(); + + int diff = mTargetDegree - mCurrentDegree; + diff = diff >= 0 ? diff : 360 + diff; // make it in range [0, 359] + + // Make it in range [-179, 180]. That's the shorted distance between the + // two angles + diff = diff > 180 ? diff - 360 : diff; + + mClockwise = diff >= 0; + mAnimationEndTime = mAnimationStartTime + + Math.abs(diff) * 1000 / ANIMATION_SPEED; + + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + + Drawable drawable = getDrawable(); + if (drawable == null) return; + + Rect bounds = drawable.getBounds(); + int w = bounds.right - bounds.left; + int h = bounds.bottom - bounds.top; + + if (w == 0 || h == 0) return; // nothing to draw + + if (mCurrentDegree != mTargetDegree) { + long time = AnimationUtils.currentAnimationTimeMillis(); + if (time < mAnimationEndTime) { + int deltaTime = (int)(time - mAnimationStartTime); + int degree = mStartDegree + ANIMATION_SPEED + * (mClockwise ? deltaTime : -deltaTime) / 1000; + degree = degree >= 0 ? degree % 360 : degree % 360 + 360; + mCurrentDegree = degree; + invalidate(); + } else { + mCurrentDegree = mTargetDegree; + } + } + + int saveCount = canvas.getSaveCount(); + canvas.rotate(-mCurrentDegree, w / 2, h / 2); + drawable.draw(canvas); + canvas.restoreToCount(saveCount); + } +} |