实际上,与之前的说法不同,<item>
也有width
和height
属性。感谢@Entreco发表的演示。
对于Drawable
,android:width
和android:height
与View
的android:layout_width
和android:layout_height
类似,但不能设置为match_parent
或wrap_content
,不过可以通过将属性android:gravity
设置为left|right
或start|end
(以匹配父级的宽度)或top|bottom
(以匹配父级的高度)来实现与match_parent
相同的行为。
不幸的是,这些属性仅从API 23开始提供。
然而,考虑到我建议的替代match_parent
的方法以及<size>
元素(必须放在<shape>
中)可用android:width
和android:height
属性(无需新的API级别),您可以使用一个简单的解决方法:
<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>
)和一个未设置大小的
<bitmap>
(其
android:gravity
设置为
left|top|right|bottom
以匹配父容器的尺寸),因此,
<bitmap>
的实际大小将由同一父容器中唯一具有大小的
<item>
的大小确定。
编辑:感谢@Emil S注意到上述解决方案在用作窗口背景时无法使用。我猜想,在系统使用
android:windowBackground
属性指定的背景创建窗口时,没有执行布局,因为没有启动进程。因此,Android最终会在屏幕大小上光栅化可绘制对象并将其拉伸以填充整个窗口,我想。这可以解释发生这种情况的原因。确实,我想到的一个可能的解决方案,但我还没有测试过,不幸的是只支持从API级别24开始,那就是使用自定义可绘制对象作为窗口背景。通过引用使用自定义可绘制对象的XML资源(例如
这个),它是可能的。通过这种方式,问题应该得到解决,因为Android被迫在显示窗口之前启动应用程序进程,因此应正确布局可绘制对象,因为它知道窗口尺寸。然而,这会导致启动时几乎不可察觉但确实存在的延迟。
编辑:@João Carlos指出,当使用自适应图标(由背景和前景组成的那些图标,支持矢量可绘制对象)时,我的解决方案不起作用(因为它会导致循环继承)。然而,他的观点没有意义,因为自适应图标需要API 26:可以在闪屏或其他地方使用
android:width
和
android:height
属性,因为它们需要API 23。因此,为了使任何版本的Android都能正常工作,您需要区分两个可绘制对象,前者是
API <23 ,使用我发布的解决方案,后者是 API > = 23 ,使用我在本帖子开头提到的两个属性。