填充不会影响XML布局中的<shape>


92

我正在尝试<shape>在XML文件/布局内的声明中设置填充。但是无论我设置了什么,都没有与填充相关的更改。如果修改任何其他属性,则会在UI上看到效果。但这不适用于填充。您能否建议可能发生这种情况的原因?

这是我要设置样式的XML Shape:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" 
      android:shape="rectangle">

    <stroke android:width="1dp" 
            android:color="#ffffff" 
            android:dashWidth="2dp"/>

    <solid android:color="@color/button_white_cover"/>

    <corners android:radius="11dp"/>

    <padding android:left="1dp" 
             android:top="20dp"
             android:right="20dp" 
             android:bottom="2dp"/>
 </shape>

Answers:


113

我终于用填充解决了我的问题。

因此,此处的填充不会影响形状。取而代之的是,您将不得不在将使用填充的其他可绘制对象中应用填充。因此,我有一个使用该形状的drawable,在此执行以下操作:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/shape_below"/>
   <item android:top="10px" android:right="10px" android:drawable="@drawable/shape_cover"/>
</layer-list>

因此,正如您在第二个<item>元素中看到的那样,我设置了填充(顶部和右侧)。在此之后,一切正常。

谢谢。


嗨,我不明白如何将此解决方案应用于问题。我有一个使用形状的按钮,设置adnroid:top和android:right无效。我该如何解决?谢谢。
冰淇淋

2
我认为Lyubomyr的意思是做这样的事情,这对我有用,但是角落总是有不透明的白色背景,从而导致显示问题(对注释中的格式表示抱歉!):<layer-list xmlns:android =“ schemas.android.com/apk/res/android “> <item> <shape android:shape =” rectangle“> <size android:width =” 0dp“ android:height =” 45dp“ android:color =” @ android:颜色/透明“ /> </ shape> </ item> <item android:top =” 0dp“ android:right =” 0dp“ android:bottom =” 0dp“ android:left =” 0dp“ android:drawable =” @ drawable / button_blue_shape“ /> </ layer-list>
DustinB

也离题,但可能有用:如果您使用的可绘制对象只是一种颜色,您也可以像android:drawable =“ @ color / divider”那样编写。但是这会在较旧的设备上中断。我在2.2上测试了它,但它坏了。不知道在哪个级别可以接受。
Pijusn

实际上,<item>接受子级可绘制对象(尽管未明确记录)。这就是您可以在单个xml中实现此行为的方式。
亚历克斯·科恩

3
甚至在七年后,这个答案似乎也是正确的。到底是<shape><padding> 为了什么?
David Lord

75

正如一些评论所暗示的,最好的方法是将<shape>in包装在<item>元素中,然后在其中设置填充。但是,还有其他可用选项,下面的链接中有详细介绍。例如

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="8dp"
        android:right="8dp"
        android:top="8dp"
        android:bottom="8dp">

        <shape android:shape="rectangle">
            ...
        </shape>
    </item>
</layer-list>

根据您的需要,可以使用以下任何可绘制类型来代替使用层列表:

  • 层列表
  • 选择器
  • 等级表
  • 过渡

有关可用的可绘制类型的更多信息,请参见此android文档

资料来源:


是的,您没有提到<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924 '17

@ user924我不确定您的意思是。如果
可以满足

3
我的意思是给出一个更好的示例,您可以不使用版本进行复制和运行,但是在这种情况下,<item>不会被解析(因为它应该在<layer-list>内部)
user924

2
@ user924我明白您的意思了,非常感谢您指出问题并帮助改善答案。我已经更新了代码示例,并添加了有关可用可绘制类型的注释
TheIT

22

您可以尝试插入:

<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="2dp"
    android:insetLeft="1dp"
    android:insetRight="20dp"
    android:insetTop="20dp">

    <shape android:shape="rectangle">

        <stroke
            android:width="1dp"
            android:color="#ffffff"
            android:dashWidth="2dp" />

        <solid android:color="@color/button_white_cover" />

        <corners android:radius="11dp" />
    </shape>

</inset>

22

Lyobomyr的答案是可行的,但是这里使用的是相同的解决方案,但是没有创建新的drawable的开销,因此可以最大程度地减少文件混乱:

https://stackoverflow.com/a/3588976/578746

在上述SO答案上由anon复制/粘贴答案:

<item android:left="6dp"
      android:right="6dp">

    <shape android:shape="rectangle">
        <gradient android:startColor="#ccd0d3"
                  android:centerColor="#b6babd"
                  android:endColor="#ccd0d3"
                  android:height="1px"
                  android:angle="0"/>
    </shape>
</item>


1
感谢您的回答Yahel,但请记住不要仅发布链接答案。请务必在答案中提供所有必要的信息,因为链接内容可能会更改或变得无效。
TheIT

编辑答案
Yahel

9

我这样解决了这个问题:

<shape android:shape="oval"  >
    <stroke android:width="4dp" android:color="@android:color/transparent" />
    <solid android:color="@color/colorAccent" />
</shape>

刚刚添加了一个透明的笔画。


聪明,但我认为这是黑客:-/
dell116 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.