Размещение / перекрытие (Z-индекс) вид над другим видом в 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 по длине и ширине , помещенный над imageview, под "over" я имел в виду z-индекс больше , чем imageview , я хочу разместить его в центре и выше(перекрывая) imageview.



Я хочу знать, как мы можем поместите один вид над другим, с переменным Z-индексом (предпочтительно в линейной компоновке) ?

690   9  

9 ответов:

вы не можете использовать 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, вдоль нижнего центра изображения.

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];
    }
}

выход:

вызов OrderLayout#setDrawOrder(int) с результатами 0-1-2 в:

enter image description here enter image description here enter image description here

можно использовать view.setZ(float) начиная с уровня API 21. здесь вы можете найти более подробную информацию.

есть способ использовать 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>

AFAIK вы не можете сделать это с линейными макетами, вам придется пойти на RelativeLayout.

попробуйте это в RelativeLayout:

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

это работает для меня.

Я решил ту же проблему, добавив android:elevation="1dp" к какому виду вы хотите его над другим.

Comments

    Ничего не найдено.