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

我知道其中一个方法就是打电话给bringToFront。

有更好的方法吗?这将是伟大的,如果我可以在布局xml定义z顺序。


当前回答

在API级别21开始的Android中,布局文件中的项目的Z顺序来自于它们在文件中的顺序,如正确答案所述,以及它们的仰角,仰角值越高意味着项目的Z顺序越高。

这有时会导致问题,特别是对于经常出现在项顶部的按钮,而根据XML的顺序,这些按钮应该在它们下面以Z顺序排列。要解决这个问题,只需在布局XML中设置android:项目的提升,以匹配你想要实现的Z顺序。

如果你在布局中设置一个元素的立面,它就会开始投射阴影。如果你不想要这种效果,你可以用如下代码删除阴影:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

我还没有找到任何方法来删除通过布局xml提升视图的阴影。

其他回答

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

您也可以使用下面的代码示例来实现相同的效果

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

这是向后兼容的。 这里mccardview是一个应该在sourceView下面的视图。

我遇到了同样的问题:在一个相对布局parentView中,我有两个孩子childView1和childView2。首先,我把childView1放在childView2上面,我想让childView1在childView2上面。改变孩子们观点的顺序并没有解决我的问题。对我有用的是在parentView上设置android:clipChildren="false",在我设置的代码中:

childView1.bringToFront();

parentView.invalidate();

在API级别21开始的Android中,布局文件中的项目的Z顺序来自于它们在文件中的顺序,如正确答案所述,以及它们的仰角,仰角值越高意味着项目的Z顺序越高。

这有时会导致问题,特别是对于经常出现在项顶部的按钮,而根据XML的顺序,这些按钮应该在它们下面以Z顺序排列。要解决这个问题,只需在布局XML中设置android:项目的提升,以匹配你想要实现的Z顺序。

如果你在布局中设置一个元素的立面,它就会开始投射阴影。如果你不想要这种效果,你可以用如下代码删除阴影:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

我还没有找到任何方法来删除通过布局xml提升视图的阴影。

你可以使用重定义的自定义RelativeLayout

getChildDrawingOrder (int childCount, int i)

注意-这个方法将参数i作为“我应该在哪个视图中绘制i”。 这就是ViewPager的工作原理。它与PageTransformer一起设置自定义绘制顺序。