我希望定义Android RelativeLayout中各视图的z顺序。
我知道一种方法是调用bringToFront
函数。
是否有更好的方法可以在布局XML中定义z顺序呢?这将会很方便。
我希望定义Android RelativeLayout中各视图的z顺序。
我知道一种方法是调用bringToFront
函数。
是否有更好的方法可以在布局XML中定义z顺序呢?这将会很方便。
从API 21开始,在Android中,布局文件中的项根据它们在文件中的顺序(如正确答案所述)和它们的高度获得它们的Z顺序,更高的高度值意味着该项获得更高的Z顺序。这有时会导致问题,特别是对于按照XML顺序应该在其下方的项目上经常显示在按钮上的情况。要解决此问题,只需将布局XML中的项目的android:elevation
设置为您想要实现的Z顺序。
如果您设置了布局中元素的高度,则会开始投射阴影。如果您不希望出现此效果,则可以使用以下代码删除阴影:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
我还没有找到任何一种方法可以通过布局xml去除高程视图的阴影。
android:elevation="1000dp"
。这样就不会渲染阴影了。 - Vadim Kotovandroid:outlineProvider="none"
。 - Francis我遇到了相同的问题:在一个相对布局的parentView中,我有两个子视图childView1和childView2。一开始,我将childView1放在childView2上面,并且我想让childView1在childView2的顶部。改变子视图的顺序并不能解决我的问题。对我有用的是在parentView上设置android:clipChildren="false",并在代码中设置:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
和 parent.invalidate()
一起使用可以实现某项功能,但是 parent.bringChildToFront(child)
不能。这让我感到非常沮丧,因为我们都期望操作系统有逻辑性。 - Oliver Hauslerandroid:clipChildren="false"
解决了问题。谢谢! - JCarlosR由于 XML 字段
的介绍使得情况有了一些变化,所以我想补充一个回答。其他回答建议运行...android:translationZ
childView1.bringToFront();
parentView.invalidate();
除了这段代码无法将带有硬编码android:translationZ的视图放在childView1前面外,你的所有观点都是完全正确的。我遇到了这个问题,一旦我从其他视图中删除了这个字段,bringToFront()就可以正常工作。
API 21内置了view.setElevation(float)
为了向后兼容,使用ViewCompat.setElevation(view, float);
更多方法包括ViewCompat.setZ(v, pixels)
和ViewCompat.setTranslationZ(v, pixels)
另一种方法是收集按钮或视图数组并使用addView
添加到RelativeLayout中
childView.bringToFront() 对我无效,所以我将最近添加的项(覆盖所有其他子项的项)的 Z 轴平移设置为负值,如下所示:
lastView.setTranslationZ(-10);
更多信息请参见https://developer.android.com/reference/android/view/View.html#setTranslationZ(float)。
RelativeLayout
并重新定义其protected int getChildDrawingOrder (int childCount, int i)
方法。i
作为“我应该绘制第几个视图”。这是ViewPager
的工作方式。它与PageTransformer
一起设置自定义绘制顺序。