我想在Android中定义RelativeLayout视图的z顺序.
我知道这样做的一种方法是打电话bringToFront
.
有更好的方法吗?如果我可以在布局xml中定义z顺序会很棒.
最简单的方法是简单地关注视图添加到XML文件的顺序.文件中的下降意味着在Z轴上向上.
编辑:这是记录在这里,并在这里对Android开发者网站.(谢谢@flightplanner)
如果你想在代码中执行此操作,则可以执行此操作
View.bringToFront();
看文档
请注意,API 21及更高版本中的按钮和其他元素具有较高的高程,因此无论父布局如何,都会忽略元素的xml顺序.我花了一段时间才想出那一个.
在从API级别21开始的Android中,布局文件中的项目从它们在文件中的排序方式得到它们的Z顺序,如正确答案中所述,并且从它们的高程,更高的高程值意味着该项目获得更高的Z顺序.
这有时会导致问题,特别是经常出现的项目,根据XML的顺序应该是低于他们在Z顺序的顶部按钮.要解决此问题,只需设置android:elevation
布局XML中的项目以匹配您要实现的Z顺序.
我在布局中设置了一个元素的高程,它将开始投射阴影.如果您不想要此效果,可以使用如下代码删除阴影:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myView.setOutlineProvider(null); }
我没有找到任何方法通过布局xml删除高架视图的阴影.
我遇到了同样的问题:在相对布局parentView中,我有2个子childView1和childView2.首先,我将childView1放在childView2之上,我希望childView1位于childView2之上.改变儿童观点的顺序并没有为我解决问题.对我有用的是在parentView和我设置的代码中设置android:clipChildren ="false":
childView1.bringToFront(); parentView.invalidate();
请注意,您可以view.setZ(float)
从API级别21开始使用.您可以在此处找到更多信息.
以为我会在引入之后添加一个答案
机器人:translationZ
XML领域改变了一点点.其他答案表明正在运行
childView1.bringToFront(); parentView.invalidate();
因为这段代码不会将带有硬编码的android:translationZ的任何视图前面的childView1带到XML文件中.我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()工作得很好.
API 21具有view.setElevation(float)
内置功能
使用ViewCompat.setElevation(view, float);
的向后兼容性
更多方法ViewCompat.setZ(v, pixels)
和ViewCompat.setTranslationZ(v, pixels)
另一种方法是收集按钮或查看数组并用于addView
添加到RelativeLayout