实际上,与之前所说的不同,还有宽度和高度属性<item>
。感谢@Entreco 发布了一个演示。
android:width
and android:height
for s 与and for Drawable
s 类似,不同之处在于它们可以设置为 none或,但是您可以通过将属性设置为or (以匹配父级的宽度)或(以匹配父级的高度)来实现相同的行为.android:layout_width
android:layout_height
View
match_parent
wrap_content
match_parent
android:gravity
left|right
start|end
top|bottom
不幸的是,这些属性仅从 API 级别 23 开始可用。
但是,考虑到我建议的上述方法match_parent
和属性可用于元素(必须放在 a 中)而不需要更新的 API 级别,您可以使用一个简单的解决方法:android:width
android:height
<size>
<shape>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape
android:shape="rectangle">
<size
android:width="152dp"
android:height="152dp"/>
<solid
android:color="#00FFFFFF"/>
</shape>
</item>
<item>
<bitmap
android:gravity="left|right|top|bottom"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
上述解决方案利用了已设置为匹配两个父级尺寸的已调整大小的<item>
(带有透明的<shape>
)和未调整大小的(带有 a 的)。因此,实际大小将由同一父级中唯一大小的大小决定。<bitmap>
android:gravity
left|top|right|bottom
<bitmap>
<item>
编辑:
感谢@Emil S 注意到上述解决方案在用作窗口背景时不起作用。我可以猜测,当系统创建一个由android:windowBackground
属性指定的背景的窗口时,没有执行任何布局,因为还没有启动任何进程。因此,我认为,Android 最终会在屏幕尺寸上对可绘制对象进行光栅化,并将其拉伸以填充整个窗口。这将解释这是如何发生的。实际上,我想到的一个可能的解决方案是使用自定义可绘制对象作为窗口背景,但我还没有测试过,不幸的是,仅从 API 级别 24 开始才支持该解决方案。可以通过引用使用自定义可绘制对象的 XML 资源来实现,如下所示. 这样,问题应该得到解决,因为Android在显示窗口之前被迫启动应用程序进程,因此drawable应该正确布局,因为它知道窗口尺寸。然而,这将导致启动时几乎不明显但存在的延迟。
编辑:
@João Carlos 指出我的解决方案在使用自适应图标(由背景和前景组成的支持矢量可绘制对象的那些图标)时不起作用(因为它会导致循环继承)。但是,他的观点没有意义,因为自适应图标需要API 26:android:width
并且android:height
属性可以在启动屏幕或其他东西上使用,因为它们需要API 23。
因此,为了让任何东西在任何版本的 Android 中工作,您需要区分两个可绘制对象,前者用于API < 23,使用我发布的解决方案,后者用于API >= 23,使用两个属性正如我在这篇文章开头所说的那样。