前言
高通Camera2相机存在两个问题:
- 在任何设置中选择任何尺寸,预览都是全屏。
- 横竖屏切换不流畅
预览与拍照尺寸不匹配
高通目前使用的手机8916基线是16:9的屏幕,如果选择非16:9的尺寸,比如选择VGA,如果仍然全屏显示,则会照成预览的部分不能显示出来,造成拍照完成后的照片和预览不一致。
解决办法。根据预览比例的不同,设置用于显示preview的view的尺寸比例与预览比例一致。
以拍照界面为例:
src/com/android/camera/PhotoUI.java在函数 public void setAspectRatio(float ratio) 中,增加如下代码:
// for lock screen, preview display as ratio w = mDm.widthPixels < mDm.heightPixels ? mDm.widthPixels : mDm.heightPixels; h = (int)(w * ratio); mTextureView.setLayoutParams(new LayoutParams(w, h, Gravity.CENTER));
使得preview能居中全部显示。
横竖屏切换不流畅
横竖屏切换不流畅是在切换的过程中,界面会根据layout-land,layout-port重新layout。导致预览卡顿。
解决办法:
拍照界面锁定orientaion
src/com/android/camera/PhotoModule.java中增加锁定为Portrait
public void lockOrientationPortrait() { mOrientationLocked = true; mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
拍照界面UI element需要更根据角度信息rotate
src/com/android/camera/PhotoUI.java
public void onOrientationChanged(int orientation) { mOnScreenIndicators.onOrientationChanged(-orientation); mSwitcher.setOrientation(orientation, false); }
拍照界面时锁定oriention为portrait,切换到内置图库则解锁
源码package/app/目录下,Camera2内置了图库预览,不需要进入外置图库应用来查看图片,实现了图库和相机的分离。
src/com/android/camera/PhotoModule.java
public void onPreviewFocusChanged(boolean previewFocused) { mUI.onPreviewFocusChanged(previewFocused); + if(previewFocused) { + mOrientationManager.lockOrientationPortrait(); + }else { + mOrientationManager.unlockOrientation(); + }
解锁后需要重新layout用于显示preview的TextureView
onPreviewFocusChanged中发现是切换到了图库,则重新调用setAspectRatio
@@ -631,6 +668,7 @@ public class PhotoUI implements PieListener, } public void onPreviewFocusChanged(boolean previewFocused) { + mPreviewFocused = previewFocused; if (previewFocused) { showUI(); } else { @@ -651,6 +689,9 @@ public class PhotoUI implements PieListener, } setShowMenu(previewFocused); if (!previewFocused && mCountDownView != null) mCountDownView.cancelCountDown(); + if(!mPreviewFocused) { + setAspectRatio(mRatio); + } }
setAspectRatio()
+ }else { + // for swap between camera and built-in gallery, and rotation in built-in gallery + if(mDm.widthPixels > mDm.heightPixels) { + h = mDm.heightPixels; + w = (int)(mDm.heightPixels * mRatio); + Log.v(TAG, "mPreviewFocused:"+mPreviewFocused+",w:"+w+",h:"+h); + } else { + w = mDm.widthPixels; + h = (int)(mDm.widthPixels * mRatio); + } + }
测试
- 进入相机后,选择不同的照片尺寸,拍照,和预览尺寸比较。如果有略微的不同(很仔细的观察)是正常的。
- 在相机界面横竖屏切换,看界面元素是否旋转。
- 滑入图库,看预览是否正常。在图库中横竖屏切换,再回到相机界面,看界面是否正常。