为什么Android中的layer-list drawable如此智能?

3

我无法深入了解安卓如何实现其层列表绘制。但是我觉得这很有趣,我几乎不知道为什么会发生这种情况。

以下是一些可绘制内容:

九宫格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>

水波纹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>

所有图层都包含在layer-list中。
<?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>

很遗憾,我仍然无法在L预览版上使用截屏功能,但我可以描述一下。

所得到的形状(显然我没有明确设置其尺寸)并没有覆盖整个Nine-Patch。 Nine-Patch未伸展的部分被神奇地视为某种“自动填充物”。 我所期望的是(好吧,我实际上期望的就是Android为我完成的事情,我的意思是...假设...):尺寸不特别大的形状可覆盖整个Nine-Patch,就像后者是普通png文件一样。

但是这个形状确实会神奇地避开Nine-Patch中未拉伸的部分,只覆盖它的拉伸部分。

这太棒了......但令人困惑,为什么?我可能无法深入挖掘源代码,但这听起来反直觉(但很好)。 我想知道原因。所以我在这里发布了这个帖子。

由于我正在使用一个Android L版本,因此我将其标记为android-L。 但我认为从gingerbread开始应该也可以工作。


2
你所看到的效果是由于九宫格可绘制对象自动从边缘的不可拉伸区域隐式地定义其填充,如果没有明确定义,则图层列表将累积每个先前图层的填充到后续图层上。当从多个部分创建可绘制对象时,这种组合非常有用。 - corsair992
@corsair992 非常有帮助和实用。我知道这个功能来自于某个地方,但从未想过是哪里。知道9-patch-drawable是有效的东西真是太好了。你可以把它作为答案,我会选择它作为被接受的答案。 - user977289
1个回答

6
这种效果是由两个因素组合造成的:
  1. 所有的九宫格可绘制对象都会自动从内容区域的边缘定义一个填充区域。内容区域可以通过在边框上使用右侧和底部线条来明确定义,也可以通过左侧和顶部线条定义的可拉伸区域隐式定义。

  2. 默认情况下,层列表将填充累加到下一层,有效地将每一层视为前一层的内容。

* Lollipop引入了一个新的属性来禁用这种行为。属性


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