在XML可绘制文件中绘制多个矩形

6
我正在尝试找出如何在Android的xml drawable中创建一个3x3小矩形行。
这并没有使我更接近目标(只有两个小矩形,但它们重叠在一起):
<?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个回答

7

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

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在评论中指出,您无法在标签中引用形状可绘制对象,因此如果您想让其余部分起作用,您需要将正方形创建为实际的位图图形。然后,您可以定义一个图层列表,不会缩放各个正方形:
<?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>

我没有测试过这个,所以可能会有些偏差,但是你应该能够微调它来得到想要的结果。重要的是要消除缩放。


我喜欢这个方向,但是我的显示器上没有任何东西显示。有什么想法吗? - WOPR
@user1059096 - 嗯,我不知道为什么它不起作用。(实际上,有一个大问题:每次出现<bitmap>标签时,都是错误的。应该是:<scale android:drawable="@drawable/square" android:scaleGravity="top|left" /><bitmap> drawable需要引用原始位图,而我试图使用它来引用<shape> drawable。)但即使进行了更改,它也不起作用(我刚刚确认过)。等我有点时间再深入研究一下。这非常奇怪。 - Ted Hopp
这个不起作用,位图无法加载XML形状 - 这会导致错误消息“<bitmap>需要有效的src属性”。因此,似乎甚至无法从形状层生成图像这样基本的操作都不可能。 - Someone Somewhere
@SomeoneSomewhere - 我不确定你在尝试什么,但那不是我发布的内容。我发布的代码所有的<bitmap>标签都有有效的src属性。 - Ted Hopp
我昨天了解到<bitmap>无法加载<shape>。要使其正常工作,必须拥有真实的图像。 - Someone Somewhere
@SomeoneSomewhere - 这怎么样?我猜OP将不得不使用实际的图形文件来制作正方形。 - Ted Hopp

1
请查看图层列表文档
这将澄清 top , left , bottom 和 right 是维度中的属性,用于偏移项目的:该项目本身应从其父级(图层列表)的边框放置多远。
如果您知道您的层列表的宽度为130 dp,高度为130 dp,并且想在那里放置3x3个矩形,则第一个偏移应为
top: 10
left: 10
bottom: 90
right: 90

并且下一个是(第一行,第二列):

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

第一行顶部:50 左侧:10 底部:50 右侧:90第二行顶部:90 左侧:10 底部:10 右侧:90 - Lunf

0

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

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

然而,ScaleDrawables 的问题在于它们旨在用于动画。它们似乎从级别 0 开始,这使它们变得非常小且不可见。此外,似乎无法在 XML 中设置级别。

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

另请参见 this question


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接