在xml drawable中绘制多个矩形

时间:2012-05-21 16:59:50

标签: android drawable

我正在试图弄清楚如何在android xml drawable中创建一个3x3行的小矩形。
这并没有真正让我接近(2个小的,但它们重叠):

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

    <item android:left="20dp" android:top="20dp" android:right="25dp" android:bottom="25dp" >
        <shape android:shape="rectangle">
            <stroke android:width="1px" android:color="#fff" />
            <solid android:color="#00FF0000" />
            <corners android:radius="3dp" />
        </shape>
    </item>


    <item android:left="30dp" android:top="30dp" android:right="35dp" android:bottom="25dp" >
    <shape android:shape="rectangle">
            <stroke android:width="1px" android:color="#fff" />
            <solid android:color="#00FF0000" />
            <corners android:radius="3dp" />
            <size android:width="10dp"
                  android:height="10dp"/>
        </shape>
    </item>


</layer-list>

3 个答案:

答案 0 :(得分:7)

部分问题是图层列表中的各个项目会缩放到可绘制的整体大小。如the docs中所述,您可以通过将小方块包裹在bitmap drawable中来解决此问题。这样的事可能有用。首先,将基本形状定义为单独的drawable:

<强>抽拉/ square.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1px" android:color="#fff" />
    <solid android:color="#00FF0000" />
    <corners android:radius="3dp" />
    <size android:width="10dp" android:height="10dp"/>
</shape>

<击>

(编辑:如果你能做到这一点会很好,但不幸的是,正如@Someone Somewhere在评论中指出的那样,你不能在<bitmap>标签内引用形状可绘制的内容。您必须将方块创建为实际的位图图形,以便其余部分工作。)

然后,您可以定义一个不会缩放单个正方形的图层列表:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- first row -->
    <item android:left="20dp" android:top="20dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="35dp" android:top="20dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="50dp" android:top="20dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>

    <!-- second row -->
    <item android:left="20dp" android:top="35dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="35dp" android:top="35dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="50dp" android:top="35dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>

    <!-- third row -->
    <item android:left="20dp" android:top="50dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="35dp" android:top="50dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
    <item android:left="50dp" android:top="50dp">
        <bitmap android:src="@drawable/square" android:gravity="top|left" />
    </item>
</layer-list>

我还没有对此进行过测试,因此可能会有点偏差,但您应该能够调整它以获得您想要的效果。重要的是摆脱缩放。

答案 1 :(得分:1)

请参阅documentation of Layer Lists

它会清除,topleftbottomright维度中的属性,用于项目的偏移量:项目本身应该从它的父级边界(图层列表)放置多远。

如果你知道你的图层列表是130 dp宽和130 dp高,并且你想要3x3矩形,那么第一个的偏移应该是

top: 10
left: 10
bottom: 90
right: 90

和下一个(第一行,第二列):

top: 10
left: 50
bottom: 90
right: 50

答案 2 :(得分:0)

正如讨论已经揭示的那样,使用位图仅限于实际位图;其他(XML)drawables不能在这里使用。

ScaleDrawables应该是适合您的解决方案。它们应该提供在结果边界框内调整位置所需的属性。

然而,ScaleDrawables受制于它们用于动画的事实。它们似乎从0级开始,这使得它们看起来很小。此外,似乎无法在XML中设置级别。

如果您可以在代码中设置ScaleDrawables的关卡,请尝试一下。

另请参阅this question