Размещение/Перекрытие (z-index) вид над другим представлением в android
У меня есть линейная компоновка, состоящая из 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-индексом (желательно в линейном макете)?
Ответы
Ответ 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, вдоль нижнего центра изображения.
Ответ 2
Попробуйте .bringToFront()
:
http://developer.android.com/reference/android/view/View.html#bringToFront%28%29
Ответ 3
RelativeLayout работает одинаково, выигрывает последнее изображение в относительном макете.
Ответ 4
Изменение порядка розыгрыша
Альтернативой является изменение порядка, в котором представления отрисовываются родителем. Вы можете включить эту функцию из 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];
}
}
Выход:
Вызов OrderLayout#setDrawOrder(int)
с 0-1-2 приводит к:
![enter image description here]()
Ответ 5
Вы можете использовать view.setZ(float)
, начиная с уровня API 21. Здесь вы можете найти дополнительную информацию.
Ответ 6
Существует способ использования 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>
Ответ 7
Попробуйте это в RelativeLayout:
ImageView image = new ImageView(this);
image.SetZ(float z);
Это работает для меня.
Ответ 8
AFAIK вы не можете сделать это с помощью линейных макетов, вам нужно будет RelativeLayout.
Ответ 9
Я решил ту же проблему, добавив android:elevation="1dp"
для которого вы хотите видеть его поверх другого. Но он не может отображаться ниже 5,0, и у него будет небольшая тень, если вы можете принять его, все в порядке.
Итак, самое правильное решение - @kcoppock.