我有一个线性布局,其中包括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索引(最好是线性布局)?


当前回答

改变绘制顺序

另一种方法是改变父视图绘制的顺序。你可以通过调用setChildrenDrawingOrderEnabled(true)和覆盖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];
    }
}

输出:

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

其他回答

改变绘制顺序

另一种方法是改变父视图绘制的顺序。你可以通过调用setChildrenDrawingOrderEnabled(true)和覆盖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];
    }
}

输出:

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

在RelativeLayout中试试这个:

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

这对我很管用。

尝试一下.bringToFront():

http://developer.android.com/reference/android/view/View.html#bringToFront%28%29

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

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

afaiout你不能用线性布局,你必须去一个相对布局。