【问题标题】:Overlapping Views in AndroidAndroid中的重叠视图
【发布时间】:2010-11-01 00:12:02
【问题描述】:

Android 中是否可以有重叠的视图?我想要一个 ImageView,前面有一个透明的 png,背景有另一个视图。

编辑:

这是我目前的情况,问题是imageView中的图像不透明,应该透明的部分只是黑色。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/gallerylayout"
>
<Gallery android:id="@+id/overview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

 <ImageView android:id="@+id/navigmaske"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/navigmask"
    /> 

</RelativeLayout>

编辑:

我得到了它,它是来自团队中另一位程序员的主题文件。 刚刚改了这个

<item name="android:background">#FF000000</item>

到这里

<item name="android:background">#00000000</item>

【问题讨论】:

  • 你所拥有的应该可以工作——你确定画廊有可见的内容并且 navigmaske drawable 是具有透明度的 PNG?
  • 是的,画廊在没有覆盖的情况下是可见的,我确信 PNG 是透明的

标签: android view android-relativelayout


【解决方案1】:

Android 原生处理跨视图和可绘制对象(包括 PNG 图像)的透明度,因此您描述的场景(Gallery 前面的部分透明 ImageView)当然是可能的。

如果您遇到问题,可能与布局或图片有关。我已经复制了您描述的布局并成功实现了您所追求的效果。这是我使用的确切布局。

<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/gallerylayout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <Gallery
    android:id="@+id/overview"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
  />
  <ImageView
    android:id="@+id/navigmaske"
    android:background="#0000"      
    android:src="@drawable/navigmask"
    android:scaleType="fitXY"
    android:layout_alignTop="@id/overview"
    android:layout_alignBottom="@id/overview"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
  />
</RelativeLayout>

请注意,我已将父级 RelativeLayout 更改为 fill_parent 的高度和宽度,这通常是主 Activity 所需的。然后我将ImageView 的顶部和底部与Gallery 的顶部和底部对齐,以确保它在它前面居中。

我还明确将ImageView 的背景设置为透明。

至于可绘制的图像本身,如果您将 PNG 文件放在某个地方供我查看,我可以在我的项目中使用它,看看它是否负责。

【讨论】:

  • 不错!我尝试将 ImageView 背景设置为 #0000(和 @android:color/transparent)……但无济于事。如果我尝试淡化它(alpha 从 1.0 到 0.0),它会淡化为黑色而不是淡化为透明。这是在 Android 2.0 上。
  • 啊哈!我正在使用线性布局。我将其更改为相对,然后将 ImageView 放在最后。现在褪色“正常工作”......耶!感谢大量的代码/提示。这暗示了我的愚蠢。
  • 嗨,我使用相同的 xml 布局编码,但我的透明图像没有显示。它只显示黑屏。我想在我的代码中添加的任何内容。
  • 考虑到功能,我想说FrameLayout 通常应该优先用于此类目的,因为布局开销要低得多。但是,对于 API RelativeLayout 是您唯一的选择; see here.
【解决方案2】:

另外,看看FrameLayout,这就是相机的图库应用程序实现缩放按钮覆盖的方式。

【讨论】:

  • 我一直选择FrameLayout,我觉得它非常适合这种用途。但是,我现在才发现,在 API 11 之前,FrameLayout 无法将最大测量高度传播到其所有子代see here。因此,为了支持 Android 2,必须使用RelativeLayout,除非达到预定高度。
【解决方案3】:

如果您想在 Layout 上添加自定义 Overlay 屏幕,您可以创建自定义线性布局并控制绘图和按键事件。你可以我的教程-Android 布局上的叠加- http://prasanta-paul.blogspot.com/2010/08/overlay-on-android-layout.html

【讨论】:

  • 当然是一个不错的实验,谢谢分享代码。但这可以通过 FrameLayout 轻松实现,除非您的特定场景受到 API 11 之前的错误 see here 的影响,在这种情况下您仍然可以使用 RelativeLayout
【解决方案4】:

可见图库会改变可见性,这是​​您将图库置于其他视图重叠之上的方式。 Home 示例应用中有一些很好的这种技术示例。

【讨论】:

    【解决方案5】:

    最简单的方法是将-40dp边距放在顶部imageview的底部

    【讨论】:

      【解决方案6】:

      现在在 android 中使用 Jetpack Compose,您应该使用 Box 来重叠视图。 示例。

      Box(modifier = Modifier.fillMaxWidth().fillMaxHeight()){
              RecipesList(viewModel.recipes.value)
              Snackbar()
          }
      

      这里的 RecipesList 和 Snackbar 是在组合顺序中一个在另一个之上的组合

      查看 Jetpack Compose 示例 - https://androidlearnersite.wordpress.com/2021/08/03/jetpack-compose-1-0-0-sample-codes/

      【讨论】:

        【解决方案7】:

        是的,这是可能的。然而,挑战在于正确地进行布局。最简单的方法是拥有一个 AbsoluteLayout,然后将两个图像放在您想要的位置。除了稍后将其添加到布局之外,您无需对透明 png 执行任何特殊操作。

        【讨论】:

        • AbsoluteLayout 现已弃用。没有人应该再使用它了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多