2010-04-10 43 views
183

我想定义Android中RelativeLayout视图的z顺序。在Android中定义RelativeLayout视图的Z顺序

我知道这样做的一种方法是拨打bringToFront

是否有更好的方法来做到这一点?如果我可以在布局xml中定义z顺序,那将是非常好的。

+4

查看添加它.bringToFront();是anser – 2016-06-22 10:24:59

回答

268

最简单的方法是简单地注意视图添加到XML文件的顺序。在文件中降低意味着在Z轴上向上。

编辑: 在Android开发人员网站上记录为herehere。 (感谢@flightplanner)

+2

谢谢Steve H!此功能是否记录在某处?我不希望我的布局打破新的Android版本。 – hpique 2010-04-10 18:26:25

+0

嗯,我不确定。稍后我会挖掘一下,看看我能找到什么。然而其他地方也使用相同的原则;画布(用于二维图形)以同样的方式工作。所以我怀疑这不会改变。不过,这是一件好事,要检查。 – 2010-04-10 23:25:07

+14

这是不幸的,并不总是可以改变。例如,在一个相对布局,每个元素只能相对于以前的文件 – Casebash 2010-05-20 02:20:37

76

如果你想这样做的代码 你可以做

View.bringToFront(); 

看到docs

13

我遇到了同样的问题:在一个相对布局parentView,我有2个孩子childView1和childView2。起初,我把childView1放在childView2的上面,我想让childView1放在childView2的上面。改变儿童观点的顺序并不能解决我的问题。什么工作对我来说是设置机器人:clipChildren =上parentView和代码“假”我设置:

childView1.bringToFront(); 

parentView.invalidate(); 
+2

这是工作,Android让我很伤心。 ''child.bringToFront()'用'parent.invalidate()'工作,但'parent.bringChildToFront(child)'不。我们都期望从操作系统中获得什么逻辑? – 2015-05-06 15:21:43

+2

在'LinearLayout'中弄乱了孩子们的订单... – 2015-07-10 12:05:10

10

请注意,您可以使用view.setZ(float)从API级别开始21 Here你可以找到更多信息。

+0

setz在API级别21以下不可用。并bringtoFront()有闪烁的问题。任何想法实现相同? – 2016-02-15 10:50:47

8

想我会添加一个答案,因为引进了

的android:translationZ

XML领域变化的东西一点点。在XML文件中translationZ:该建议运行

childView1.bringToFront(); 

parentView.invalidate(); 

其他的答案是完全当场就除了这个代码不会带来childView1在任何视图中的正面配有一块硬编码的机器人。我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()就工作得很好。

+0

这对于android 5的“海拔”也是如此。 – shelll 2015-08-20 16:43:53

2

childView。bringToFront()并没有为我工作,所以我设置了至少最近添加的项目(这就是一个覆盖所有其他子女)为负值,像这样的Z翻译:

lastView.setTranslationZ(-10);

看到https://developer.android.com/reference/android/view/View.html#setTranslationZ(float)更多

+0

谢谢,这有助于我在本机底部导航栏之上绘制视图。由于某种原因,尽管位于xml – Granjero 2017-05-31 14:40:00

+0

中,但它仍处于最佳状态谢谢,仅适用于API 21及更高版本。 – noe 2017-07-11 15:39:33

10

在Android中从API级别21开始,在布局文件中的项目得到他们是如何在文件中有序,在正确答案描述,并从他们抬高他们的Z顺序都,海拔较高值意味着物品得到更高的Z顺序。

这有时会引起问题,特别是经常出现在项根据XML的顺序应低于它们的Z次序的顶部的按钮。要解决这个问题,只需将布局XML中项目的android:elevation设置为与要实现的Z顺序相匹配即可。

我你设置布局元素的高度将开始蒙上了一层阴影。如果你不想要这个效果,你可以用代码中删除的影子,像这样:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    myView.setOutlineProvider(null); 
} 

我还没有发现任何方式,通过布局文件删除正视图的影子。

32

请注意,在API按钮和其他元件21和更大的具有高海拔,因此忽略元素的XML顺序考虑父布局。花了我一段时间来弄清楚这一点。

+5

是的,它确实如此。花了我几个小时才意识到它.. – aldok 2017-01-20 22:25:31

+4

对于我来说,这个错误的解决方案是在我想在按钮上呈现的视图上调用setElevation(1000)。 – Shaegorath 2017-05-22 16:23:10

+0

谢谢。在阅读您的答案之前,我摸了一下头,然后理解为什么在稍后添加的广告视图上方显示一个按钮。 – Hong 2017-10-19 21:40:40

2

API 21具有view.setElevation(float)内建

使用ViewCompat.setElevation(view, float);为了向后兼容

更多方法ViewCompat.setZ(v, pixels)ViewCompat.setTranslationZ(v, pixels)

花药方式收集按钮或视图阵列并在结束

相关问题