diff options
| author | Monika Alekhya <malekh@codeaurora.org> | 2013-07-26 16:15:12 +0530 |
|---|---|---|
| committer | Steve Kondik <shade@chemlab.org> | 2013-10-18 15:54:49 -0700 |
| commit | 18ff2a5a30715ea1a6bbbc53a994e00226a5513a (patch) | |
| tree | b9daeb9b49632d4f6b3ab39d805f88e19f4c21d2 /src | |
| parent | e9643f7d46dca93634afffcd32908793eb231041 (diff) | |
| download | android_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.tar.gz android_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.tar.bz2 android_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.zip | |
Camera: Fix for stretched preview in camera and camcorder.
Stretched preview is observed due to camera sensor's mount angle.
So resize the preview frame using aspect ratios to avoid this.
Change-Id: Ie8a9e062782aa6caaa80ddab705c937da6b0761e
CRs-fixed: 510295
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/android/camera/PhotoModule.java | 29 | ||||
| -rw-r--r-- | src/com/android/camera/PhotoUI.java | 10 | ||||
| -rw-r--r-- | src/com/android/camera/PreviewFrameLayout.java | 46 | ||||
| -rw-r--r-- | src/com/android/camera/VideoModule.java | 14 | ||||
| -rw-r--r-- | src/com/android/camera/VideoUI.java | 4 | ||||
| -rw-r--r-- | src/com/android/camera/ui/PieRenderer.java | 4 |
6 files changed, 99 insertions, 8 deletions
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 11842b31d..0df8994a5 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -524,8 +524,10 @@ public class PhotoModule View root = mUI.getRootView(); // These depend on camera parameters. - int width = root.getWidth(); - int height = root.getHeight(); + int width = mUI.mPreviewFrameLayout.getWidth(); + int height = mUI.mPreviewFrameLayout.getHeight(); + openCameraCommon(); + resizeForPreviewAspectRatio(); mFocusManager.setPreviewSize(width, height); // Full-screen screennail if (Util.getDisplayRotation(mActivity) % 180 == 0) { @@ -535,7 +537,6 @@ public class PhotoModule } // Set touch focus listener. mActivity.setSingleTapUpListener(root); - openCameraCommon(); onFullScreenChanged(mActivity.isInCameraApp()); } @@ -572,6 +573,7 @@ public class PhotoModule mFocusManager.setMirror(mirror); mFocusManager.setParameters(mInitialParams); setupPreview(); + resizeForPreviewAspectRatio(); openCameraCommon(); @@ -1355,6 +1357,24 @@ public class PhotoModule } } + void setPreviewFrameLayoutCameraOrientation(){ + CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId]; + //if camera mount angle is 0 or 180, we want to resize preview + if(info.orientation % 180 == 0){ + mUI.mPreviewFrameLayout.setRenderer(mUI.mPieRenderer); + mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(true); + } else{ + mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(false); + } + } + + private void resizeForPreviewAspectRatio() { + setPreviewFrameLayoutCameraOrientation(); + Size size = mParameters.getPictureSize(); + Log.e(TAG,"Width = "+ size.width+ "Height = "+size.height); + mUI.setAspectRatio((double) size.width / size.height); + } + @Override public void installIntentFilter() { } @@ -1527,6 +1547,7 @@ public class PhotoModule } setDisplayOrientation(); + resizeForPreviewAspectRatio(); } @Override @@ -2017,6 +2038,7 @@ public class PhotoModule } else if (isCameraIdle()) { if (mRestartPreview) { Log.d(TAG, "Restarting preview"); + resizeForPreviewAspectRatio(); startPreview(); mRestartPreview = false; } @@ -2074,6 +2096,7 @@ public class PhotoModule } setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE); + resizeForPreviewAspectRatio(); mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup, mPreferences); } diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 68507f461..a26e1a088 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -64,6 +64,7 @@ public class PhotoUI implements PieListener, private PreviewGestures mGestures; private View mRootView; + protected PreviewFrameLayout mPreviewFrameLayout; private Object mSurfaceTexture; private volatile SurfaceHolder mSurfaceHolder; @@ -83,7 +84,7 @@ public class PhotoUI implements PieListener, private OnScreenIndicators mOnScreenIndicators; - private PieRenderer mPieRenderer; + protected PieRenderer mPieRenderer; private ZoomRenderer mZoomRenderer; private Toast mNotSelectableToast; @@ -127,7 +128,8 @@ public class PhotoUI implements PieListener, initIndicators(); mCountDownView = (CountDownView) (mRootView.findViewById(R.id.count_down_to_capture)); mCountDownView.setCountDownFinishedListener((OnCountDownFinishedListener) mController); - + mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame); + mPreviewFrameLayout.setOnLayoutChangeListener(mActivity); if (ApiHelper.HAS_FACE_DETECTION) { ViewStub faceViewStub = (ViewStub) mRootView .findViewById(R.id.face_view_stub); @@ -190,6 +192,10 @@ public class PhotoUI implements PieListener, updateOnScreenIndicators(params, prefGroup, prefs); } + public void setAspectRatio(double ratio) { + mPreviewFrameLayout.setAspectRatio(ratio); + } + private void openMenu() { if (mPieRenderer != null) { // If autofocus is not finished, cancel autofocus so that the diff --git a/src/com/android/camera/PreviewFrameLayout.java b/src/com/android/camera/PreviewFrameLayout.java index 03ef91c60..c37ebf27e 100644 --- a/src/com/android/camera/PreviewFrameLayout.java +++ b/src/com/android/camera/PreviewFrameLayout.java @@ -22,9 +22,9 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewStub; import android.widget.RelativeLayout; - import com.android.camera.ui.LayoutChangeHelper; import com.android.camera.ui.LayoutChangeNotifier; +import com.android.camera.ui.PieRenderer; import com.android.gallery3d.R; import com.android.gallery3d.common.ApiHelper; @@ -44,11 +44,16 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo private View mBorder; private OnSizeChangedListener mListener; private LayoutChangeHelper mLayoutChangeHelper; + private boolean mOrientationResize; + private boolean mPrevOrientationResize; + private PieRenderer mPieRenderer; public PreviewFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); setAspectRatio(4.0 / 3.0); mLayoutChangeHelper = new LayoutChangeHelper(this); + mOrientationResize = false; + mPrevOrientationResize = false; } @Override @@ -56,13 +61,27 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo mBorder = findViewById(R.id.preview_border); } + public void cameraOrientationPreviewResize(boolean orientation){ + mPrevOrientationResize = mOrientationResize; + mOrientationResize = orientation; + } + public void setAspectRatio(double ratio) { if (ratio <= 0.0) throw new IllegalArgumentException(); + if (getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT) { + ratio = 1 / ratio; + } + if (mAspectRatio != ratio) { mAspectRatio = ratio; requestLayout(); } + if(mOrientationResize != mPrevOrientationResize) { + requestLayout(); + } + } public void showBorder(boolean enabled) { @@ -73,10 +92,16 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo Util.fadeOut(mBorder); } + public void setRenderer(PieRenderer renderer) { + mPieRenderer = renderer; + } + @Override protected void onMeasure(int widthSpec, int heightSpec) { int previewWidth = MeasureSpec.getSize(widthSpec); int previewHeight = MeasureSpec.getSize(heightSpec); + int originalWidth = previewWidth; + int originalHeight = previewHeight; if (!ApiHelper.HAS_SURFACE_TEXTURE) { // Get the padding of the border background. @@ -108,6 +133,25 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo previewHeight += vPadding; } + if (mOrientationResize) { + previewHeight = (int) (previewWidth * mAspectRatio); + + if (previewHeight > originalHeight) { + previewWidth = (int)(((double)originalHeight / (double)previewHeight) * previewWidth); + previewHeight = originalHeight; + } + /* If the preview size of frame is small e.g. less than options menu size, + then the later appears cropped. This is because the child views use the parent + dimensions for layout sizes. Hence for now as a workaround the preview sizes are + updated to atleast match the options menu dimensions. This will result in a slight + stretch of preview images */ + if(mPieRenderer != null) { + int settingsDiameter = mPieRenderer.getDiameter(); + if(previewWidth < settingsDiameter) previewWidth = settingsDiameter; + else if(previewHeight < settingsDiameter) previewHeight = settingsDiameter; + } + } + // Ask children to follow the new preview dimension. super.onMeasure(MeasureSpec.makeMeasureSpec(previewWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(previewHeight, MeasureSpec.EXACTLY)); diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 9a58985ab..cdd2a000d 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -853,7 +853,20 @@ public class VideoModule implements CameraModule, ". mDesiredPreviewHeight=" + mDesiredPreviewHeight); } + void setPreviewFrameLayoutCameraOrientation(){ + CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId]; + + //if camera mount angle is 0 or 180, we want to resize preview + if(info.orientation % 180 == 0){ + mUI.mPreviewFrameLayout.setRenderer(mUI.mPieRenderer); + mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(true); + } else{ + mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(false); + } + } + private void resizeForPreviewAspectRatio() { + setPreviewFrameLayoutCameraOrientation(); mUI.setAspectRatio( (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight); } @@ -2228,6 +2241,7 @@ public class VideoModule implements CameraModule, public void onConfigurationChanged(Configuration newConfig) { Log.v(TAG, "onConfigurationChanged"); setDisplayOrientation(); + resizeForPreviewAspectRatio(); } @Override diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index 5ab9ec006..99cad8743 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -54,7 +54,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, // module fields private CameraActivity mActivity; private View mRootView; - private PreviewFrameLayout mPreviewFrameLayout; + protected PreviewFrameLayout mPreviewFrameLayout; private boolean mSurfaceViewReady; private PreviewSurfaceView mPreviewSurfaceView; // An review image having same size as preview. It is displayed when @@ -69,7 +69,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, private LinearLayout mLabelsLinearLayout; private View mTimeLapseLabel; private RenderOverlay mRenderOverlay; - private PieRenderer mPieRenderer; + protected PieRenderer mPieRenderer; private VideoMenu mVideoMenu; private AbstractSettingPopup mPopup; private ZoomRenderer mZoomRenderer; diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java index 61abc3717..eaf91b037 100644 --- a/src/com/android/camera/ui/PieRenderer.java +++ b/src/com/android/camera/ui/PieRenderer.java @@ -897,6 +897,10 @@ public class PieRenderer extends OverlayRenderer return 2 * mCircleSize; } + public int getDiameter() { + return (mArcRadius + mRadiusInc + (mRadiusInc / 4)); + } + private int getRandomRange() { return (int)(-60 + 120 * Math.random()); } |
