在Android中定义RelativeLayout视图的Z顺序

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

我知道一个这样做的方法是调用bringToFront

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

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

编辑:这是在Android开发者网站这里和这里logging。 (谢谢@flightplanner)

如果你想在代码中做到这一点,你可以做

 View.bringToFront(); 

看文档

请注意,API 21及更高版本中的button和其他元素具有较高的高度,因此无论父级布局如何,都会忽略元素的xml顺序。 花了我一会儿来弄清楚那一个。

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

 childView1.bringToFront(); parentView.invalidate(); 

请注意,您可以从API级别21开始使用view.setZ(float) 。 在这里您可以find更多信息。

在从API级别21开始的Android中,布局文件中的项目从它们在文件内的sorting方式获得它们的Z顺序,如正确答案中所述,并且从它们的标高中,更高的标高值意味着项目获得更高的Z顺序。

这有时会导致问题,特别是对于经常出现在按照XML顺序的项目顶部的button应该在Z顺序下的button。 要解决这个问题,只需在你的布局XML中设置项目的android:elevation ,以匹配你想要实现的Z顺序。

我在布局中设置了一个元素的高程,它将开始投射阴影。 如果你不想要这个效果,你可以用下面的代码去除阴影:

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

我还没有find任何方法通过布局xml删除高架视图的阴影。

以为我会添加一个答案自推出以来

机器人:translationZ

XML领域改变了一些东西。 其他答案表明运行

 childView1.bringToFront(); parentView.invalidate(); 

除了这个代码不会在任何视图前带有一个硬编码的android:translationZ在XML文件中的childView1之外。 我有这个问题,一旦我从其他视图中删除这个领域,bringToFront()工作得很好。

childView.bringToFront()对我不起作用,所以我将最近添加的最less的项目(覆盖所有其他子项的项目)的Z翻译设置为负值,如下所示:

lastView.setTranslationZ(-10);

有关更多信息,请参阅https://developer.android.com/reference/android/view/View.html#setTranslationZ(float);

您可以使用自定义的RelativeLayout重新定义

protected int getChildDrawingOrder (int childCount, int i)

请注意 – 这个方法把参数i当作“我应该画出哪个视图”。 这是ViewPager工作原理。 它与PageTransformer结合设置自定义绘图顺序。

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

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

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

另一种方法收集button或查看数组,并在最后添加它

    Interesting Posts