在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或查看数组,并在最后添加它