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つのビューを他のビューの上に置くことができるか知りたいですか?
これには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の上、画像の下中央に沿って描画されます。
.bringToFront()
を試してみてください。
http://developer.Android.com/reference/Android/view/View.html#bringToFront%28%29
RelativeLayoutも同様に機能し、相対レイアウトの最後のイメージが優先されます。
別の方法は、ビューが親によって描画される順序を変更することです。 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)
を呼び出すと、次のようになります。
APIレベル21からview.setZ(float)
を使うことができます。 ここ あなたはより多くの情報を見つけることができます。
私はあなたが他のものにそれを望むビューにAndroid:elevation="1dp"
を追加することによって同じ問題を解決しました。しかし、5.0以下では表示できません。少し影を付けてもかまいません。それを受け入れることができれば、問題ありません。
それで、@ kcoppockである最も正しい解決策は言いました。
RelativeLayoutでこれを試してください。
ImageView image = new ImageView(this);
image.SetZ(float z);
わたしにはできる。
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>
線形レイアウトではできませんが、 RelativeLayout を指定する必要があります。