我无法深入了解android是如何实现其层列表drawable的。但我觉得很有趣,我很难知道为什么会这样。
这里有一些可抽的:
九补丁XML
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/cam2tst_ripple_bg_img">
</nine-patch>
形状XML
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<padding
android:left="@dimen/cam2tst_ripple_horizontal_padding"
android:top="@dimen/cam2tst_ripple_vertical_padding"
android:right="@dimen/cam2tst_ripple_horizontal_padding"
android:bottom="@dimen/cam2tst_ripple_vertical_padding" />
<solid android:color="@android:color/holo_green_dark" />
</shape>
Ripple XML
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/holo_green_light">
<item android:drawable="@drawable/cam2tst_ripple_shape"></item>
</ripple>
包含以上所有内容的层列表
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/cam2tst_ripple_bg_img" />
<item android:drawable="@drawable/cam2tst_ripple_base" />
</layer-list>
不可饶恕的是,我仍然不能让我的屏幕截图在我的预览工作,但我可以描述它。
我得到的是形状(我显然没有明确地设置它的大小)并没有覆盖整个九个补丁!九个补丁中未被拉伸的部分神奇地被认为是某种“自动填充的东西”。我所期待的(好吧,我所期待的正是安卓为我所做的,我的意思是我所做的……假设……)是一个不那么积极的东西:不是特别大小的形状可绘制覆盖整个九个补丁,就像后者是一个正常的PNG。
但这个形状确实神奇地避开了九个补丁的未拉伸部分,并且只覆盖在九个补丁的拉伸部分之上。
这太棒了…但是让人困惑,为什么?我可能无法深入挖掘源头,但这听起来确实有违直觉(但很好)。但我想知道原因。所以我把这个贴在这里。
因为我把它标记为android-l是因为我正在做一个。但我认为这应该是姜饼之类的东西起作用的(只是用其他东西代替波纹,也许是一个嵌入的可拉伸的等等)。
最佳答案
这种影响是由两个因素共同造成的:
所有九个面片可绘制都有一个从内容区域边缘自动定义的填充区域。内容区域可以显式地定义,在边界处使用右行和底行,或者从左行和顶行定义的可拉伸区域隐式地定义。
默认情况下,层列表将每一层上的填充累积应用于下一层*,有效地将每一层视为上一层的内容。
*棒棒糖引入了一种新的attribute来抑制这种行为。