我想在Android中定义RelativeLayout的视图的z顺序。
我知道一种方法是调用bringToFront。
bringToFront
有更好的方法吗?这将是伟大的,如果我可以在布局xml定义z顺序。
最简单的方法就是注意视图添加到XML文件中的顺序。文件的下方意味着z轴的上方。
如果你想在代码中这样做 你可以执行
View.bringToFront();
看到文档
我遇到了同样的问题:在一个相对布局parentView中,我有两个孩子childView1和childView2。首先,我把childView1放在childView2上面,我想让childView1在childView2上面。改变孩子们观点的顺序并没有解决我的问题。对我有用的是在parentView和我设置的代码中设置android: clipChildren = " false ":
childView1.bringToFront(); parentView.invalidate();
请注意,你可以从API级别21开始使用view.setZ(float)。在这里你可以找到更多信息。
view.setZ(float)
我想我应该加上一个答案,因为介绍了
android: translationZ
XML字段稍微改变了一点。其他答案建议你跑步
除了这段代码不会把childView1在任何视图前硬编码的android:translationZ在XML文件中。我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()工作得很好。
你可以使用自定义的RelativeLayout重新定义
RelativeLayout
protected int getChildDrawingOrder (int childCount, int i) .
protected int getChildDrawingOrder (int childCount, int i)
i
i'th
ViewPager
PageTransformer
childView.bringToFront()对我来说不起作用,所以我设置了最近添加的项目(覆盖所有其他孩子的项目)的Z翻译为负值,如下所示:
lastView.setTranslationZ(-10);
更多信息见https://developer.android.com/reference/android/view/View.html setTranslationZ(浮动)
在API级别21开始的Android中,布局文件中的项目的Z顺序来自于它们在文件中的顺序,如正确答案所述,以及它们的仰角,仰角值越高意味着项目的Z顺序越高。
这有时会导致问题,特别是对于经常出现在项顶部的按钮,而根据XML的顺序,这些按钮应该在它们下面以Z顺序排列。要解决这个问题,只需在布局XML中设置项目的android:elevation,以匹配您想要实现的Z顺序。
android:elevation
如果你在布局中设置一个元素的立面,它就会开始投射阴影。如果你不想要这种效果,你可以用如下代码删除阴影:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myView.setOutlineProvider(null); }
我还没有找到任何方法来删除通过布局xml提升视图的阴影。
请注意,API 21及更高版本中的按钮和其他元素都有很高的高度,因此忽略元素的xml顺序,而不管父布局如何。我花了好长时间才想明白。
API 21内置了view.setElevation(float)
view.setElevation(float)
使用ViewCompat.setElevation(view, float);实现向后兼容性
ViewCompat.setElevation(view, float);
更多方法ViewCompat.setZ(v, pixels)和ViewCompat.setTranslationZ(v, pixels)
ViewCompat.setZ(v, pixels)
ViewCompat.setTranslationZ(v, pixels)
另一种方法是收集按钮或视图数组并使用addView添加到RelativeLayout
addView
检查在XML中的某个视图上是否有任何提升。如果是,请向其他项目添加标高或删除标高以解决问题。从这里开始,是视图的顺序决定了什么在其他视图之上。
或者把重叠的按钮或视图放在一个框架布局中。然后,xml文件中的RelativeLayout将尊重添加的子布局的顺序。
您也可以使用下面的代码示例来实现相同的效果
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
向后兼容。 这里mCardView是一个应该在sourceView下面的视图
mCardView
sourceView