11

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

9 补丁可绘制

2段:

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

设置为背景图像时给出此结果:

9-patch 作为列表项示例

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

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

4

3 回答 3

4

这是不可能的。这是我找到的最佳解决方案。只有 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 非常有限。恕我直言,我的建议最接近您的要求。

于 2013-02-01T09:05:08.763 回答
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_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity" >

    <View
        android:background="@drawable/list_left_border"
        android:layout_width="8dp"
        android:layout_height="match_parent" />

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

</LinearLayout>

这是图像。背景是粉红色的,表明列表项是透明的。

在此处输入图像描述

于 2013-02-01T15:37:13.143 回答
2

我将更进一步,建议对 AndroidGuy 的答案进行轻微修改,该答案本身包括 Leonidos 的答案。

相同的可绘制 XML,不同的列表项 XML 如下:

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

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="100sp">

    <ImageView
        android:layout_width="8dp"
        android:layout_height="match_parent"
        android:src="@drawable/list_left_border" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="Item Text"
        android:textSize="22sp" >
    </TextView>
</FrameLayout>

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

我在下面展示了这一点,并展示了背景:

插图

但这并不真正值得积分。

于 2013-02-04T14:35:43.037 回答