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

时间:2010-04-10 18:16:22

标签: android android-relativelayout z-order

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

我知道一种方法是调用bringToFront

有更好的方法吗?如果我可以在布局xml中定义z顺序,那就太好了。

13 个答案:

答案 0 :(得分:297)

最简单的方法就是关注视图添加到XML文件的顺序。文件中的下降表示Z轴上方较高。

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

答案 1 :(得分:85)

如果您想在代码中执行此操作 你可以做到

View.bringToFront();

请参阅docs

答案 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]} });

请参阅https://jsbin.com/mapoqo/1/edit?js,console了解更多

答案 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下面的视图。