6

我试图弄清楚如何在 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>
4

3 回答 3

7

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

可绘制/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>

我还没有测试过这个,所以它可能有点偏离,但你应该能够调整它以获得你想要的。重要的是摆脱缩放。

于 2012-05-21T17:17:25.937 回答
1

请参阅图层列表的文档

它将清除topleft和是项目偏移量bottom维度right属性:项目本身应放置在距其父级(图层列表)边界多远的位置。

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

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

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

top: 10
left: 50
bottom: 90
right: 50
于 2012-05-21T17:07:54.633 回答
0

正如讨论已经揭示的那样,使用位图仅限于真实位图;此处不能使用其他 (XML) 可绘制对象。

ScaleDrawables 应该是适合您的解决方案。它们应该提供您需要在生成的边界框中调整其位置的属性。

然而,ScaleDrawables 的缺点是它们是为动画设计的。它们似乎以 0 级别开始,这使得它们看起来很小。此外,似乎无法在 XML 中设置级别。

如果您可以在代码中为 ScaleDrawables 设置级别,请尝试一下。

另外,请参阅这个问题

于 2012-12-07T13:02:04.007 回答