web-dev-qa-db-ja.com

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の別の小さなテキストビューが必要です。 "over"とは、イメージビューよりも大きいz-indexを意味します。

私はどのように私たちが(できれば線形レイアウトで)z-indexを変えて、どうやって1つのビューを他のビューの上に置くことができるか知りたいですか?

207
sat

これにはLinearLayoutを使用できませんが、 FrameLayout を使用できます。 FrameLayoutでは、zインデックスは項目が追加された順番で定義されます。例えば:

<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の上、画像の下中央に沿って描画されます。

274
kcoppock
172
diyism

RelativeLayoutも同様に機能し、相対レイアウトの最後のイメージが優先されます。

60
jt-gilkeson

描画順序を変更する

別の方法は、ビューが親によって描画される順序を変更することです。 ViewGroupからこの機能を有効にするには、 setChildrenDrawingOrderEnabled(true) を呼び出して getChildDrawingOrder(int childCount、int i) をオーバーライドします。

例:

/**
 * 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 hereenter image description hereenter image description here

23
Tobrun

APIレベル21からview.setZ(float)を使うことができます。 ここ あなたはより多くの情報を見つけることができます。

16
Vadim Kotov

私はあなたが他のものにそれを望むビューにAndroid:elevation="1dp"を追加することによって同じ問題を解決しました。しかし、5.0以下では表示できません。少し影を付けてもかまいません。それを受け入れることができれば、問題ありません。

それで、@ kcoppockである最も正しい解決策は言いました。

9
thirtyyuan

RelativeLayoutでこれを試してください。

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

わたしにはできる。

6
Rizzo

LinearLayoutを使用する方法があります。前の要素の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>
5
Tim

線形レイアウトではできませんが、 RelativeLayout を指定する必要があります。

4