Android中的重叠视图

Posted

技术标签:

【中文标题】Android中的重叠视图【英文标题】:Overlapping Views in Android 【发布时间】: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_
    android:layout_
    android:id="@+id/gallerylayout"
>
<Gallery android:id="@+id/overview"
    android:layout_
    android:layout_
    />

 <ImageView android:id="@+id/navigmaske"
    android:layout_
    android:layout_
    android:src="@drawable/navigmask"
    /> 

</RelativeLayout>

编辑:

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

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

到这里

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

【问题讨论】:

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

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

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

<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/gallerylayout"
  android:layout_
  android:layout_>
  <Gallery
    android:id="@+id/overview"
    android:layout_ 
    android:layout_
  />
  <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_ 
    android:layout_
  />
</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 现已弃用。没有人应该再使用它了。

以上是关于Android中的重叠视图的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在android中的relativelayout中重叠视图

Android:如何不重叠动态视图? +视图的动态位置

如何修复与Recyclerview重叠的视图?

Android片段重叠

片段内容重叠工具栏和底部导航视图

Android:具有重叠行的垂直 ListView