我在Android应用中构建了自定义相机活动,并在FrameLayout中渲染相机预览。但是,我遇到问题,使用运行KitKat的设备 - 相机预览的宽高比似乎不正确(你可以看到事物看起来与左边的图像垂直压扁)。但是,当我拍摄照片时,保存的图像的宽高比是正确的(您可以在右侧的图像中看到)。
如何修复此宽高比问题?
以下是我如何检查设备是否正在运行KitKat,然后我应用全屏布局:
// put the views behind the navigation bar
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN){
Log.d(TAG, "adjusting to account for navigation bar");
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN );
}
这是我设置相机预览尺寸的原因:
private void setHolderParameters() {
Log.d(TAG, "setting camera layout parameters");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
Size mPreviewSize = CameraPreview.getOptimalPreviewSize(camera
.getParameters().getSupportedPreviewSizes(), width, height);
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
parameters.set("orientation", "portrait"); // default orientation to
// portrait
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
}
这是我的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:orientation="vertical" >
<HorizontalScrollView
android:id="@+id/gallery_scroll_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:scaleType="fitXY"
>
<com.example.helperClass.PictureHorizontalLayout
android:id="@+id/mygallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:scaleType="fitXY" >
</com.example.helperClass.PictureHorizontalLayout>
</HorizontalScrollView>
<FrameLayout
android:id="@+id/camerapreview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/black"
/>
<LinearLayout
android:id="@+id/button_holder_customized_cam"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_alignParentBottom="true"
android:background="#838B8B"
android:gravity="bottom"
android:orientation="horizontal"
android:weightSum="0.9"
>
<ImageButton
android:id="@+id/gallery_customized_camera"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.3"
android:adjustViewBounds="true"
android:background="@null"
android:contentDescription="@string/add"
android:maxWidth="75dp"
android:scaleType="center"
android:src="@drawable/ic_action_picture" >
<!-- android:background="@drawable/custom_button_blue" -->
</ImageButton>
<ImageButton
android:id="@+id/shutter_customized_camera"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="1dp"
android:layout_weight="0.3"
android:adjustViewBounds="true"
android:background="@drawable/custom_button_blue"
android:contentDescription="@string/add"
android:maxWidth="75dp"
android:scaleType="center"
android:src="@drawable/ic_action_camera" >
</ImageButton>
<ImageButton
android:id="@+id/video_customized_camera"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.3"
android:adjustViewBounds="true"
android:background="@null"
android:contentDescription="@string/add"
android:maxWidth="75dp"
android:scaleType="center"
android:src="@drawable/ic_action_video" >
<!-- android:background="@drawable/custom_button_blue" -->
</ImageButton>
</LinearLayout>
<TextView
android:id="@+id/camera_timer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/button_holder_customized_cam"
android:layout_alignParentRight="true"
android:padding="15dp"
android:text="@string/no_time"
android:textColor="@color/red"
android:textSize="20sp"
android:visibility="invisible" >
</TextView>
</RelativeLayout>
答案 0 :(得分:1)
width
的 height
和CameraPreview.getOptimalPreviewSize()
应根据当前的屏幕布局进行计算,并考虑系统显示的所有元素(例如导航栏)屏幕以及应用逻辑决定显示的元素(例如button_holder_customized_cam
)。
对于前者,您的控制有限(例如切换到全屏布局);对于后者,您可以调整它们的大小以填充预览表面周围的间隙(具有正确的宽高比)。
根据我的理解,如果有必要,可以留下一些填充非侵入性背景颜色的边距。您可以使用其他视图覆盖预览曲面,这在视觉上等效于裁剪预览图像。实际上,在技术上可以(但不容易)裁剪预览图像本身。