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

hpi*_*que 219 android z-order android-relativelayout

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

我知道这样做的一种方法是打电话bringToFront.

有更好的方法吗?如果我可以在布局xml中定义z顺序会很棒.

Ste*_*ley 306

最简单的方法是简单地关注视图添加到XML文件的顺序.文件中的下降意味着在Z轴上向上.

编辑:这是记录在这里,并在这里对Android开发者网站.(谢谢@flightplanner)

  • Casebash,我不认为必须使用"@ + id/your_element_before_its_defined",然后在稍后定义的元素中使用相同的id.我可能错了,这些布局对我来说非常棘手,但我肯定会觉得它有效. (67认同)
  • 遗憾的是,这并不总是可以改变.例如,在相对布局中,每个元素只能相对于先前在文件中定义的元素进行布局 (16认同)
  • 我知道我已经晚了大约3年了,但是在回答@hpique的时候,这里有记录[这里](http://developer.android.com/reference/android/view/View.html#Drawing) (8认同)
  • tjb是对的(我很高兴他是).首先使用@ + id和id,例如layout_above ="@ + id/some_id" (7认同)
  • 您还可以将<item type ="id"name ="<your_id>"/>放入值xml文件中,然后可以在任何地方引用它. (3认同)
  • @Snake C将位于前面/顶部,假设在实际文件中您按照A,B,C的顺序定义视图.请记住,文件中的下方意味着随后在Z轴上方增加. (2认同)

QAM*_*MAR 85

如果你想在代码中执行此操作,则可以执行此操作

View.bringToFront();
Run Code Online (Sandbox Code Playgroud)

文档


Dan*_*son 62

请注意,API 21及更高版本中的按钮和其他元素具有较高的高程,因此无论父布局如何,都会忽略元素的xml顺序.我花了一段时间才想出那一个.

  • 我的这个错误的解决方案是在我希望通过按钮呈现的视图上调用setElevation(1000). (16认同)

lej*_*onl 18

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

这有时会导致问题,特别是经常出现的项目,根据XML的顺序应该是低于他们在Z顺序的顶部按钮.要解决此问题,只需设置android:elevation布局XML中的项目以匹配您要实现的Z顺序.

我在布局中设置了一个元素的高程,它将开始投射阴影.如果您不想要此效果,可以使用如下代码删除阴影:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}
Run Code Online (Sandbox Code Playgroud)

我没有找到任何方法通过布局xml删除高架视图的阴影.


Ton*_* Vu 14

我遇到了同样的问题:在相对布局parentView中,我有2个子childView1和childView2.首先,我将childView1放在childView2之上,我希望childView1位于childView2之上.改变儿童观点的顺序并没有为我解决问题.对我有用的是在parentView和我设置的代码中设置android:clipChildren ="false":

childView1.bringToFront();

parentView.invalidate();
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,Android让我很难过.`child.bringToFront()`与`parent.invalidate()`有效,但`parent.bringChildToFront(child)`没有.我们都期望从操作系统的逻辑在哪里? (2认同)

Vad*_*tov 14

请注意,您可以view.setZ(float)从API级别21开始使用.您可以在此处找到更多信息.


The*_*tle 11

以为我会在引入之后添加一个答案

机器人:translationZ

XML领域改变了一点点.其他答案表明正在运行

childView1.bringToFront();

parentView.invalidate();
Run Code Online (Sandbox Code Playgroud)

因为这段代码不会将带有硬编码的android:translationZ的任何视图前面的childView1带到XML文件中.我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()工作得很好.


kip*_*ip2 5

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

lastView.setTranslationZ(-10);

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


Qam*_*mar 5

API 21具有view.setElevation(float)内置功能

使用ViewCompat.setElevation(view, float);的向后兼容性

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

另一种方法是收集按钮或查看数组并用于addView添加到RelativeLayout