diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2011-10-18 13:33:25 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2011-10-19 11:40:32 -0700 |
commit | 131cf9886c4f34431598be0b1f5b7aaa915277cc (patch) | |
tree | da143de60c5decb4435e252952a3c1b6a97c620a /src | |
parent | d7a60abbee203872df4b5ab9a873e7efad80e239 (diff) | |
download | packages_apps_LegacyCamera-131cf9886c4f34431598be0b1f5b7aaa915277cc.zip packages_apps_LegacyCamera-131cf9886c4f34431598be0b1f5b7aaa915277cc.tar.gz packages_apps_LegacyCamera-131cf9886c4f34431598be0b1f5b7aaa915277cc.tar.bz2 |
Add hysteresis to orientation rounding.
This prevents fast flickering between two orientation states, which
can result in ugly UI issues, especially with the preview thumbnail.
Bug: 5477483
Change-Id: I9513547207ae1918066c1a19947c974eaad72e24
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/camera/Camera.java | 6 | ||||
-rw-r--r-- | src/com/android/camera/Util.java | 18 | ||||
-rwxr-xr-x | src/com/android/camera/VideoCamera.java | 5 | ||||
-rwxr-xr-x | src/com/android/camera/panorama/PanoramaActivity.java | 6 |
4 files changed, 21 insertions, 14 deletions
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 685319f..589a5c8 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -1184,10 +1184,6 @@ public class Camera extends ActivityBase implements FocusManager.Listener, if (mThumbnailView != null) mThumbnailView.setEnabled(enable); } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } - private class MyOrientationEventListener extends OrientationEventListener { public MyOrientationEventListener(Context context) { @@ -1200,7 +1196,7 @@ public class Camera extends ActivityBase implements FocusManager.Listener, // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mOrientation = roundOrientation(orientation); + mOrientation = Util.roundOrientation(orientation, mOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mOrientation diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java index 768bf27..31a54d5 100644 --- a/src/com/android/camera/Util.java +++ b/src/com/android/camera/Util.java @@ -71,6 +71,9 @@ public class Util { // Use the same setting among the Camera, VideoCamera and Panorama modes. private static final float DEFAULT_CAMERA_BRIGHTNESS = 0.7f; + // Orientation hysteresis amount used in rounding, in degrees + public static final int ORIENTATION_HYSTERESIS = 5; + public static final String REVIEW_ACTION = "com.android.camera.action.REVIEW"; // Private intent extras. Test only. @@ -345,6 +348,21 @@ public class Util { return result; } + public static int roundOrientation(int orientation, int orientationHistory) { + boolean changeOrientation = false; + if (orientationHistory == OrientationEventListener.ORIENTATION_UNKNOWN) { + changeOrientation = true; + } else { + int dist = Math.abs(orientation - orientationHistory); + dist = Math.min( dist, 360 - dist ); + changeOrientation = ( dist >= 45 + ORIENTATION_HYSTERESIS ); + } + if (changeOrientation) { + return ((orientation + 45) / 90 * 90) % 360; + } + return orientationHistory; + } + public static Size getOptimalPreviewSize(Activity currentActivity, List<Size> sizes, double targetRatio) { // Use a very small tolerance because we want an exact match. diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index df8adb9..6b1ed1d 100755 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -500,9 +500,6 @@ public class VideoCamera extends ActivityBase } } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } private class MyOrientationEventListener extends OrientationEventListener { @@ -516,7 +513,7 @@ public class VideoCamera extends ActivityBase // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mOrientation = roundOrientation(orientation); + mOrientation = Util.roundOrientation(orientation, mOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mOrientation diff --git a/src/com/android/camera/panorama/PanoramaActivity.java b/src/com/android/camera/panorama/PanoramaActivity.java index 25c565f..c28cc2e 100755 --- a/src/com/android/camera/panorama/PanoramaActivity.java +++ b/src/com/android/camera/panorama/PanoramaActivity.java @@ -190,10 +190,6 @@ public class PanoramaActivity extends ActivityBase implements public final boolean isValid; } - public static int roundOrientation(int orientation) { - return ((orientation + 45) / 90 * 90) % 360; - } - private class PanoOrientationEventListener extends OrientationEventListener { public PanoOrientationEventListener(Context context) { super(context); @@ -205,7 +201,7 @@ public class PanoramaActivity extends ActivityBase implements // the camera then point the camera to floor or sky, we still have // the correct orientation. if (orientation == ORIENTATION_UNKNOWN) return; - mDeviceOrientation = roundOrientation(orientation); + mDeviceOrientation = Util.roundOrientation(orientation, mDeviceOrientation); // When the screen is unlocked, display rotation may change. Always // calculate the up-to-date orientationCompensation. int orientationCompensation = mDeviceOrientation |