在android中放置/重叠(z-index)一个视图在另一个视图之上

我有一个线性布局,其中包括imageview和textview,一个在另一个线性布局。

<LinearLayout android:orientation="horizontal" ... >
<ImageView
android:id="@+id/thumbnail"
android:layout_weight="0.8"
android:layout_width="0dip"
android:layout_height="fill_parent">
</ImageView>
<TextView
android:id="@+id/description"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content">
</TextView>

一些规则可能会丢失,这是给一个想法,如何布局。 我想要另一个长度和宽度为50dip的小文本视图,放置在imageview之上,这里的“over”指的是z-index大于imageview,我想把它放在imageview的中心和上方(重叠)

我想知道我们如何将一个视图置于另一个视图之上,具有不同的z索引(最好是线性布局)?

339013 次浏览

AFAIK你不能用线性布局,你将不得不去使用

你不能使用线性布局,但你可以使用FrameLayout。在FrameLayout中,z-index由添加项的顺序定义,例如:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_drawable"
android:scaleType="fitCenter"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:padding="5dp"
android:text="My Label"
/>
</FrameLayout>

在这个例子中,TextView将被绘制在ImageView的顶部,沿着图像的底部中心。

RelativeLayout以同样的方式工作,相对布局中的最后一个图像获胜。

有一种使用线性布局的方法。只需将前一个元素的marginTop设置为相应的负值,并确保在XML中要放在上面的元素在下面的元素之后。

<linearLayout android:orientation="horizontal" ... >
<ImageView
android:id="@+id/thumbnail"
android:layout_weight="0.8"
android:layout_width="0dip"
android:layout_height="fill_parent"
>
</ImageView>
<TextView
android:id="@+id/description"
android:layout_marginTop="-20dip"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content"
>
</TextView>

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

改变绘制顺序

另一种方法是改变父视图绘制的顺序。你可以通过调用setChildrenDrawingOrderEnabled(真正的)并覆盖getChildDrawingOrder(int childCount, int i)在ViewGroup中启用这个特性。

例子:

/**
* Example Layout that changes draw order of a FrameLayout
*/
public class OrderLayout extends FrameLayout {


private static final int[][] DRAW_ORDERS = new int[][]{
{0, 1, 2},
{2, 1, 0},
{1, 2, 0}
};


private int currentOrder;


public OrderLayout(Context context) {
super(context);
setChildrenDrawingOrderEnabled(true);
}


public void setDrawOrder(int order) {
currentOrder = order;
invalidate();
}


@Override
protected int getChildDrawingOrder(int childCount, int i) {
return DRAW_ORDERS[currentOrder][i];
}
}

输出:

用0-1-2调用OrderLayout#setDrawOrder(int)的结果如下:

enter image description here enter image description here enter image description here < / p >

在RelativeLayout中试试这个:

ImageView image = new ImageView(this);
image.SetZ(float z);

这对我很管用。

我通过添加android:elevation="1dp"来解决同样的问题,你想要它超过另一个视图。但是在5.0以下是无法显示的,而且会有一点阴影,如果你能接受就可以了。

所以,最正确的解决方案是@kcoppock说。

如果以编程方式添加视图,则可以使用yourLayout.addView(view, 1);

1 is the index的地方。

我使用这个,如果你只希望在需要时将一个视图带到前面:

containerView.bringChildToFront(topView);

containerView是容器的视图要排序,赢富数据是视图,我想有作为最顶部的容器。

对于要排列的多个视图,将要使用setChildrenDrawingOrderEnabled(true)和覆盖getChildDrawingOrder(int childCount, int i)如上所述。

使用android:transformZ。它也适用于线性布局。