Размещение / перекрытие (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-индексом (предпочтительно в линейной компоновке) ?
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, вдоль нижнего центра изображения.
дать попробовать
.bringToFront():http://developer.android.com/reference/android/view/View.html#bringToFront%28%29
изменение порядка розыгрыша
альтернативой является изменение порядка, в котором представления рисуются родителем. Вы можете включить эту функцию из 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 в:
можно использовать
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);это работает для меня.



Comments