Android 在xml可绘制图形中绘制多个矩形

Android 在xml可绘制图形中绘制多个矩形,android,drawable,Android,Drawable,我正试图弄清楚如何在android xml可绘制文件中创建一个3x3行的小矩形。 这并没有真正让我接近(2个小矩形,但它们重叠): 请参阅 很明显,顶部、左侧、底部和右侧是项目偏移量的维度中的属性:项目本身应距其父项边界(层列表)多远 如果您知道图层列表的宽度为130 dp,高度为130 dp,并且需要3x3个矩形,则第一个图层的偏移量应为 top: 10 left: 10 bottom: 90 right: 90 和下一个(第一行,第二列): 问题的一部分在于图层列表中的各个项目被缩放为可

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


请参阅

很明显,
顶部
左侧
底部
右侧
是项目偏移量的维度中的属性:项目本身应距其父项边界(层列表)多远

如果您知道图层列表的宽度为130 dp,高度为130 dp,并且需要3x3个矩形,则第一个图层的偏移量应为

top: 10
left: 10
bottom: 90
right: 90
和下一个(第一行,第二列):


问题的一部分在于图层列表中的各个项目被缩放为可绘制图形的总体大小。如中所述,您可以通过将小正方形包装在可绘制的
位图中来解决此问题。像这样的东西可能有用。首先,将基本形状定义为单独的可绘制形状:

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在评论中指出的那样,你不能从
标记中引用形状可绘制图形。你必须将正方形创建为实际的位图图形,以便接下来的工作。)

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

<?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>


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

正如讨论已经揭示的,使用位图仅限于真实位图;此处不能使用其他(XML)绘图项

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

但是,ScaleDrawable的缺点是它们是用于动画的。它们似乎是从0级开始的,这使它们看起来很小。而且,似乎不可能在XML中设置级别

如果您能够接受在代码中设置ScaledRawales的级别,请尝试一下


另外,请参见。

我喜欢它的发展方向,但我的显示器上没有显示任何内容。有什么想法吗?@user1059096-Hm。我不知道为什么它不起作用。(事实上,有一个大问题:每次出现
标记时,它都是错误的。它应该是:
可绘制位图需要引用原始位图,我试图使用它来引用
可绘制位图。)但即使有这样的更改,它也不起作用(正如我刚才确认的那样)。等我有更多的时间,我会进一步调查的。这很奇怪。这不起作用位图无法加载xml形状-它会导致错误消息
需要有效的src属性
。所以看起来像从形状层生成图像这样基本的东西是不可能的。@SomeoneSomewhere-我不确定你在尝试什么,但这不是我发布的。我发布的代码对所有
标记都具有有效的
src
属性。我昨天了解到
无法加载
。要让它工作,你必须有一个真实的图像。第二行顶部:50左:10下:50右:90第三行顶部:90左:10下:10右:90
<?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>
<?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>