我无法弄清楚为什么当我使用Android相机API拍摄照片时,拍摄的照片与预览不匹配。
对于预览,我使用的FrameLayout大小为817 x 770像素。 对于前置摄像头,我选择了1280 x 768像素的预览尺寸。 由于我想要一个覆盖整个预览区域的相机预览,我设置了一个大小为1283 x 770像素的FrameLayout(保持支持的预览帧的宽高比),其中心位于其父级(817 x 770 FrameLayout) :
D/TEST (29556): View hierarchy (x/y/w/h):
D/TEST (29556): 1050/168/817/770 android.widget.FrameLayout (the parent)
D/TEST (29556): 0/0/1283/770 android.widget.FrameLayout
D/TEST (29556): 0/0/-1/-1 com.example.cameratest.MainActivity$CameraPreview
所以我希望预览有点被切断,但肯定是居中的。 事实并非如此。当我拍摄照片时,我可以清楚地看到预览中间的内容不在拍摄照片的中间:original-full-size.bmp
对于此示例,笔的末端位于预览区域的左上角和右下角。而在拍摄的照片中他们不是。左边有一个巨大的左边距,右边有一个较小的边距。
我可以在此处找到用于重现行为的代码(带有一些硬编码值的较大部分的摘录):CameraTest.zip。
问题是我无法假设预览区域与支持的相机预览尺寸的比例相匹配,并且我不想要有空白区域。我选择放弃一块预览区域。用户并不关心双方都丢失30px :)但我无法找到预览在整个画面中如此奇怪的原因。
代码在Nexus 7(2013)上运行。
我的活动布局是这样的:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}">
<FrameLayout
android:id="@+id/rootView"
android:layout_width="817px"
android:layout_height="770px"
android:layout_marginLeft="1050px"
android:layout_marginTop="168px"
android:background="#770000" />
</FrameLayout>
</FrameLayout>
现在为了保持宽高比,我添加了另一个FrameLayout(视图层次结构转储中的第二个,1283 x 770像素)。而CameraPreview是一个简单的SurfaceView
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(width, height);
layoutParams.gravity = Gravity.CENTER;
FrameLayout previewHolder = new FrameLayout(this);
previewHolder.setLayoutParams(layoutParams);
FrameLayout rootView = (FrameLayout)findViewById(R.id.rootView);
rootView.addView(previewHolder);
ViewGroup.LayoutParams paramsRoot = rootView.getLayoutParams();
Log.d("TEST", "Root: " + paramsRoot.width + " x " + paramsRoot.height);
Log.d("TEST", "Preview: " + width + " x " + height);
previewHolder.addView(cameraPreview);
如果previewHolder界限超出屏幕范围,则会出现问题。如果我将预览区域向左移动更多,那么左边距和右边距大于或等于(1283 - 817)/ 2,那么它看起来很好。