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中的重叠视图的主要内容,如果未能解决你的问题,请参考以下文章