在 android 中将一个视图放置/重叠(z-index)到另一个视图之上

发布于 2024-10-02 20:35:22 字数 705 浏览 4 评论 0原文

我有一个线性布局,由 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-index 大于 imageview ,我想将其放置在 imageview 的中心和上方(重叠)。

我想知道如何将一个视图放置在另一个视图之上,并具有不同的 z 索引(最好采用线性布局)?

I have a linear layout which consists of imageview and textview , one below another in a linear layout.

<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>

Some rules might be missing , this is to give an idea , how layout looks.
I want another small text view of say 50dip in length and width , placed over the imageview, by "over" I meant z-index more than imageview , I want to place this , in the center and above(overlapping) the imageview.

I want to know how can we place one view above the other, with varying z-index (preferably in linear layout) ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

森林散布 2024-10-09 20:35:22

您不能为此使用 LinearLayout,但可以使用 FrameLayout。在 FrameLayout 中,z-index 由添加项目的顺序定义,例如:

<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 的底部中心绘制在 ImageView 的顶部。图像。

You can't use a LinearLayout for this, but you can use a FrameLayout. In a FrameLayout, the z-index is defined by the order in which the items are added, for example:

<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>

In this instance, the TextView would be drawn on top of the ImageView, along the bottom center of the image.

野味少女 2024-10-09 20:35:22

相对布局的工作方式相同,相对布局中的最后一个图像获胜。

RelativeLayout works the same way, the last image in the relative layout wins.

婴鹅 2024-10-09 20:35:22

更改绘制顺序

另一种方法是更改​​父视图绘制视图的顺序。您可以通过调用 setChildrenDrawingOrderEnabled(true)< 从 ViewGroup 启用此功能/a> 并覆盖 getChildDrawingOrder(int childCount, int我)

示例:

/**
 * 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) 结果为:

在此处输入图像描述
输入图像描述这里
输入图像描述这里

Changing the draw order

An alternative is to change the order in which the views are drawn by the parent. You can enable this feature from ViewGroup by calling setChildrenDrawingOrderEnabled(true) and overriding getChildDrawingOrder(int childCount, int i).

Example:

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

Output:

Calling OrderLayout#setDrawOrder(int) with 0-1-2 results in:

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

昨迟人 2024-10-09 20:35:22

我通过将 android:elevation="1dp" 添加到您想要的视图而不是另一个视图来解决了同样的问题。但是5.0以下就不能显示了,而且会有一点阴影,如果你能接受的话就OK了。

所以,最正确的解决方案是@kcoppock 说的。

I solved the same problem by add android:elevation="1dp" to which view you want it over another. But it can't display below 5.0, and it will have a little shadow, if you can accept it, it's OK.

So, the most correct solution which is @kcoppock said.

一身骄傲 2024-10-09 20:35:22

从 API 级别 21 开始,您可以使用 view.setZ(float)在这里您可以找到更多信息。

You can use view.setZ(float) starting from API level 21. Here you can find more info.

╄→承喏 2024-10-09 20:35:22

在相对布局中尝试一下:

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

它对我有用。

Try this in a RelativeLayout:

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

It works for me.

妄断弥空 2024-10-09 20:35:22

有一种方法可以使用 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>

There is a way to use LinearLayout. Just set the marginTop of your previous element to the corresponding negative value, and make sure the element you want on top is after the element you want below in your 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>
嗼ふ静 2024-10-09 20:35:22

AFAIK 你不能用线性布局来做到这一点,你必须选择 RelativeLayout< /a>.

AFAIK you cannot do it with linear layouts, you'll have to go for a RelativeLayout.

◇流星雨 2024-10-09 20:35:22

如果您只想在需要时将一个视图置于前面,我使用这个:

containerView.bringChildToFront(topView);

containerView 是要排序的视图容器,topView 是我想要的视图容器中的最上面。

要排列多个视图,将使用 setChildrenDrawingOrderEnabled(true) 并覆盖 getChildDrawingOrder(int childCount, int i) ,如上所述。

I use this, if you want only one view to be bring to front when needed:

containerView.bringChildToFront(topView);

containerView is container of views to be sorted, topView is view which i want to have as top most in container.

for multiple views to arrange is about to use setChildrenDrawingOrderEnabled(true) and overriding getChildDrawingOrder(int childCount, int i) as mentioned above.

淡墨 2024-10-09 20:35:22

如果您以编程方式添加视图,则可以使用 yourLayout.addView(view, 1);

,其中 1 是索引

If you are adding the View programmatically, you can use yourLayout.addView(view, 1);

where 1 is the index.

泪冰清 2024-10-09 20:35:22

在RelativeLayout中尝试一下:

示例XML:

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/todo"
        app:srcCompat="@drawable/ic_offer_close_outline"
        app:tint="@color/colorWhite"
        android:translationZ="999dp" />

示例java:

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

Try this in a RelativeLayout:

example XML:

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/todo"
        app:srcCompat="@drawable/ic_offer_close_outline"
        app:tint="@color/colorWhite"
        android:translationZ="999dp" />

example java:

ImageView image = new ImageView(this);
image.SetZ(float z);
清醇 2024-10-09 20:35:22

使用android:transformZ。它也适用于 LinearLayout。

Use android:transformZ. It works also with LinearLayout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文