可以用XML创建固定宽度的drawable吗?

时间:2013-01-27 18:34:31

标签: android drawable xml-drawable layer-list

我正在尝试简化一些图形,要求每个密度需要9个补丁,只需使用XML drawable。这是一个相当简单的图形:

9-patch drawable

2段:

  • 两段均为8dp
  • 上段是2dp高
  • 底部细分填充视图
  • 右侧充满透明度

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

9-patch as list item example

看起来重新创建XML drawable似乎相当简单,并且可以避免创建5个不同的9补丁图形。然而,我已经研究了图层列表drawables,插图drawables,clip drawables - 它们似乎都要求你事先知道视图的大小(例如,为了保持2dp为插入,你需要设置{ {1}}到视图的宽度 - 2dp)。我还尝试使用insetRight标记的shape标记,但这并不是一个固定的大小,只是一个固定的比例(因此对于较高的视图,它会按比例缩放)。

我是否忽略了一些简单的东西,或者这是我在布局后需要以编程方式检查的东西?

3 个答案:

答案 0 :(得分: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>

enter image description here

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

答案 1 :(得分:2)

我认为@Leonidos的答案与我提议的非常接近,除了我使用drawable作为单独的视图而不是整个列表细节布局的背景。这允许它是固定的宽度并让项目文本具有自己的背景。如果我不理解你的约束,请告诉我。

以下文件是“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>

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

enter image description here

答案 2 :(得分: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提供原始背景行为,而不是分离成新视图。

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

illustration

尽管如此,这并不值得。