前言
高通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);
+ }
+ }
测试
- 进入相机后,选择不同的照片尺寸,拍照,和预览尺寸比较。如果有略微的不同(很仔细的观察)是正常的。
- 在相机界面横竖屏切换,看界面元素是否旋转。
- 滑入图库,看预览是否正常。在图库中横竖屏切换,再回到相机界面,看界面是否正常。
本文针对高通Camera2相机存在的预览全屏显示和横竖屏切换不流畅两大问题进行了详细分析,并提供了相应的解决方法。通过调整预览比例和锁定屏幕方向等措施,改善用户体验。

3592

被折叠的 条评论
为什么被折叠?



