自定义相机纵横比不正确

时间:2014-04-04 21:29:30

标签: android camera android-4.4-kitkat aspect-ratio

我在Android应用中构建了自定义相机活动,并在FrameLayout中渲染相机预览。但是,我遇到问题,使用运行KitKat的设备 - 相机预览的宽高比似乎不正确(你可以看到事物看起来与左边的图像垂直压扁)。但是,当我拍摄照片时,保存的图像的宽高比是正确的(您可以在右侧的图像中看到)。

enter image description here

如何修复此宽高比问题?

以下是我如何检查设备是否正在运行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>

1 个答案:

答案 0 :(得分:1)

您提供给width

heightCameraPreview.getOptimalPreviewSize()应根据当前的屏幕布局进行计算,并考虑系统显示的所有元素(例如导航栏)屏幕以及应用逻辑决定显示的元素(例如button_holder_customized_cam)。

对于前者,您的控制有限(例如切换到全屏布局);对于后者,您可以调整它们的大小以填充预览表面周围的间隙(具有正确的宽高比)。

根据我的理解,如果有必要,可以留下一些填充非侵入性背景颜色的边距。您可以使用其他视图覆盖预览曲面,这在视觉上等效于裁剪预览图像。实际上,在技术上可以(但不容易)裁剪预览图像本身。