Android: 防止 ImageButton 覆盖屏幕?

Android: Preventing an ImageButton from covering the screen?

我有以下 LinearLayout,其中包含相机源预览和在相机预览之上绘制的叠加层。全屏预览。

现在,当我尝试添加一个 ImageButton 来切换正在使用的设备相机时 (front/back),我无法阻止按钮显示全屏,完全覆盖相机预览。我只想让这个按钮正常大小并位于角落,覆盖相机预览,这样用户可以按下它来改变显示在前置或后置相机上的相机预览。

我已经尝试阅读 Layouts documentation、按钮和一些教程,但我的按钮似乎没有响应我更改的任何属性。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/topLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">

    <foo.bar.ui.camera.CameraSourcePreview
      android:id="@+id/preview"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

        <ImageButton
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/switch_camera"
            android:src="@drawable/ic_switch_camera_black_48dp"
            android:paddingLeft="16dp"
            android:paddingBottom="16dp"
            android:clickable="true"
            android:contentDescription="@string/switch_camera"
            android:baselineAlignBottom="false" />

    <foo.bar.ui.camera.GraphicOverlay
        android:id="@+id/faceOverlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

  </foo.bar.ui.camera.CameraSourcePreview>

</LinearLayout>

听起来您可能已经读过这篇文章,但是 Google 的 Android 开发者文档讨论了布局和相机预览: http://developer.android.com/guide/topics/media/camera.html#preview-layout

"The following layout code provides a very basic view that can be used to display a camera preview. In this example, the FrameLayout element is meant to be the container for the camera preview class. This layout type is used so that additional picture information or controls can be overlayed on the live camera preview images."

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>

<Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>

如果我理解你的问题是正确的,你有另一个按钮应该切换到当前未使用的相机,即如果你当前正在使用前置摄像头拍照,如果你点击按钮它应该切换到后置摄像头,反之亦然。那是对的吗?

如果是这样,也许这是另一种可能性(只记得更改 YOURPACKAGENAME 和下面第一个 LinearLayout 中的 activity 名称)。两个按钮都组合在一个 LinearLayout 中,上面有用于相机预览的 FrameLayout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="YOURPACKAGENAME.MainActivity"
tools:showIn="@layout/activity_main">

<FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_capture"
        android:text="Capture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />

    <Button
        android:id="@+id/switch_camera_front_back"
        android:text="Switch Camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />

</LinearLayout>

</LinearLayout>