可以在 XML 中创建固定宽度的可绘制对象吗?

Posted

技术标签:

【中文标题】可以在 XML 中创建固定宽度的可绘制对象吗?【英文标题】:Possible to create a fixed-width drawable in XML? 【发布时间】:2013-01-11 02:58:51 【问题描述】:

我正在尝试简化一些图形,从每个密度需要 9 个补丁,到仅使用 XML 可绘制对象。这是一个相当简单的图形:

2 段:

两个段宽 8dp 顶部为 2dp 高 底部填充视图 右侧填充透明度

当设置为背景图片时给出这个结果:

看起来这应该很容易重新创建为 XML 可绘制对象,并且可以避免创建 5 个不同的 9-patch 图形。但是,我已经查看了图层列表可绘制对象、插图可绘制对象、剪辑可绘制对象——它们似乎都要求您事先知道视图的大小(例如,要将其保持为 2dp 的插图,您需要设置 @ 987654323@ 到视图的宽度 - 2dp)。我还尝试使用shape 标签的size 标签,但这并没有保持固定大小,只是固定比例(因此对于更高的视图,它将按比例缩放)。

我是否忽略了一些简单的事情,或者这是我必须在布局后以编程方式检查的事情?

【问题讨论】:

您是否尝试在每个项目上为 TextView 绘制背景?对不起,忽略这条评论@kcoppock,我看到你已经回复了我的回答。 【参考方案1】:

这是不可能的。这是我找到的最佳解决方案。只有xml,没有编码,没有位图,没有额外的视图)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <solid
            android:color="#ff0000" />
    </shape>
</item>
<item
    android:top="4dp">
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <solid
            android:color="#00ff00" />
    </shape>
</item>

<item
    android:left="10dp">
    <shape
        android:shape="rectangle">
        <solid
            android:color="#FFFFFF" />
    </shape>
</item> 
</layer-list>

您可以通过代码制作具有所需行为的自己的可绘制类型。 Xml drawable 非常有限。恕我直言,我的建议最接近您的要求。

【讨论】:

如果最后一项具有纯色作为背景,则此方法有效。如果它应该是透明的(正如问题中所要求的那样),它将不起作用。【参考方案2】:

我认为@Leonidos 的答案非常接近我的建议,除了我将可绘制对象用作单独的视图而不是整个列表详细信息布局的背景。这允许它是一个固定的宽度,并让项目文本有自己的背景。如果我不理解您的限制,请告诉我。

下面的文件是“res/drawable/list_left_border”

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#e76e63" />
        </shape>
    </item>
    <item android:top="2dp">
        <shape android:shape="rectangle" >
            <solid android:color="#ffc257" />
        </shape>
    </item>

</layer-list>

然后在“res/layout/list_item.xml”中的列表项的布局上

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    tools:context=".MainActivity" >

    <View
        android:background="@drawable/list_left_border"
        android:layout_
        android:layout_ />

    <TextView
        android:id="@+id/listItemText"
        android:textSize="15sp"
        android:padding="10dp"
        android:layout_
        android:layout_ />

</LinearLayout>

这是图片。背景为粉红色表示列表项是透明的。

【讨论】:

增加浏览量是作弊) @Leonidos 是否有drawable应该是整个detail item布局背景的约束?在我的示例中,这将是 LinearLayout 视图。还是需要作为 TextView 的背景? 我的意思是作者不想要额外的观点) @Leonidos 同意,最好不要有其他视图 - 但是,这可能仍然是一个很好的解决方案。我认为您的两个解决方案似乎都非常聪明且可行,但不可否认,drawable 只是列表项的背景(LinearLayout 或任何它可能是),因为视图实际上会被调整大小。谢谢你们的回答——我要再等一会儿接受任何一个,看看是否提出了任何其他解决方案。 :) 对此的改进是在TextView 上使用android:drawableLeft="@drawable/list_left_border"。然后你可以删除多余的View【参考方案3】:

我将更进一步,建议对 AndroidGuy 的答案稍作修改,其中包括 Leonidos 的答案。

相同的drawable XML,不同的列表项XML如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".MainActivity" >

<FrameLayout
    android:layout_
    android:layout_>

    <ImageView
        android:layout_
        android:layout_
        android:src="@drawable/list_left_border" />

    <TextView
        android:layout_
        android:layout_
        android:layout_gravity="center_vertical"
        android:text="Item Text"
        android:textSize="22sp" >
    </TextView>
</FrameLayout>

FrameLayout 提供原始背景行为,而不是分离到新视图中。

我在下面展示了这个,并带有背景来演示:

不过,这确实不值得。

【讨论】:

以上是关于可以在 XML 中创建固定宽度的可绘制对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

具有拉伸复合可绘制对象的固定宽度 TextView

如何使用xml中的可绘制形状绘制半椭圆形(Android)

可以在 Android Studio 的可绘制文件夹中创建子文件夹吗? [复制]

如何在 xml 中的可绘制对象上获得重力“底部”

在css中怎样设置能保证盒子绘制出来是正方形

以编程方式更新图像宽度和边距