我想在Android中定义RelativeLayout视图的z顺序。
我知道一种方法是调用bringToFront
。
有更好的方法吗?如果我可以在布局xml中定义z顺序,那就太好了。
答案 0 :(得分:297)
答案 1 :(得分:85)
答案 2 :(得分:57)
请注意,API 21及更高版本中的按钮和其他元素具有较高的高程,因此无论父布局如何,都会忽略元素的xml顺序。我花了一段时间才想出那个。
答案 3 :(得分:16)
在Android级别从API级别21开始,布局文件中的项目从文件中的排序方式获取Z顺序,如正确答案中所述,并且从其高程,更高的高程值意味着项目获得更高的Z顺序。
这有时会导致问题,特别是对于经常出现在项目顶部的按钮,根据XML的顺序,这些按钮应按Z顺序排在它们之下。要解决此问题,只需设置布局XML中项目的android:elevation
以匹配您想要实现的Z顺序。
我在布局中设置了一个元素的高程,它将开始投射阴影。如果您不想要这种效果,可以使用如下代码删除阴影:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
我没有找到任何方法通过布局xml删除高架视图的阴影。
答案 4 :(得分:13)
我遇到了同样的问题:在相对布局parentView中,我有2个子childView1和childView2。首先,我将childView1放在childView2之上,我希望childView1位于childView2之上。改变儿童观点的顺序并没有为我解决问题。对我有用的是在parentView和我设置的代码中设置 android:clipChildren =" false" :
childView1.bringToFront();
parentView.invalidate();
答案 5 :(得分:12)
请注意,您可以从API级别21开始使用view.setZ(float)
。Here您可以找到更多信息。
答案 6 :(得分:11)
以为我会在引入
后添加答案机器人:translationZ
XML字段改变了一点点。其他答案表明正在运行
childView1.bringToFront();
parentView.invalidate();
完全出现在EXCEPT上,因为这段代码不会将带有硬编码的android:translateZ的任何视图前面的childView1带到XML文件中。我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()工作得很好。
答案 7 :(得分:5)
API 21具有view.setElevation(float)
内置
使用ViewCompat.setElevation(view, float);
向后兼容
更多方法ViewCompat.setZ(v, pixels)
和ViewCompat.setTranslationZ(v, pixels)
另一种方法是收集按钮或查看数组并使用addView
添加到RelativeLayout
答案 8 :(得分:3)
childView.bringToFront()对我没用,所以我将最近添加的项目(覆盖所有其他孩子的项目)的Z翻译设置为负值,如下所示:
var obj = YOUR OBJECT...
var a = Object.keys(obj[0]).map(function(key) {
return {[key]: obj[0][key]}
});
答案 9 :(得分:1)
您可以将自定义RelativeLayout
与重新定义
protected int getChildDrawingOrder (int childCount, int i)
请注意 - 此方法将参数i
视为“我应该在哪个视图中绘制i'th
”。
这就是ViewPager
的工作原理。它与PageTransformer
一起设置自定义绘图顺序。
答案 10 :(得分:0)
检查XML中的某个视图是否有任何高程。如果是这样,请将高程添加到其他项目或删除高程以解决问题。从那里开始,这是视图的顺序,决定了什么在另一个之上。
答案 11 :(得分:0)
或将重叠的按钮或视图放在FrameLayout内。然后,xml文件中的RelativeLayout将遵循子布局添加时的顺序。
答案 12 :(得分:0)
您也可以使用下面的代码示例来实现相同的目的
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
这是向后兼容的。
这里的mCardView
是应该位于sourceView
下面的视图。