2014-9-23-8916-QCamera-预览与拍照尺寸不匹配-横竖屏切换不流畅

前言

高通Camera2相机存在两个问题:

  1. 在任何设置中选择任何尺寸,预览都是全屏。
  2. 横竖屏切换不流畅

预览与拍照尺寸不匹配

高通目前使用的手机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);
+                }
+            }

测试

  • 进入相机后,选择不同的照片尺寸,拍照,和预览尺寸比较。如果有略微的不同(很仔细的观察)是正常的。
  • 在相机界面横竖屏切换,看界面元素是否旋转。
  • 滑入图库,看预览是否正常。在图库中横竖屏切换,再回到相机界面,看界面是否正常。

发布了27 篇原创文章 · 获赞 2 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wlia/article/details/42125415