为什么Android图层列表可绘制如此智能?

时间:2014-11-04 04:17:09

标签: android android-layout drawable android-5.0-lollipop nine-patch

我无法深入了解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>

涟漪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>

不幸的是,我仍然无法在我的L预览中获取截图,但我可以对其进行描述。

我得到的是形状(我显然没有明确地设定它的大小)并不覆盖整个九个补丁!九个补丁的未拉伸部分被神奇地认为是某种&#34;自动填充的东西&#34;。我期待的是什么(好吧我期待android为我做了什么,我的意思是我......假设...)是不是那么积极的东西:覆盖整个九个补丁的不特别大小的形状,就好像后者是正常的png一样。

但是这个形状确实神奇地避免了9个补丁的未拉伸部分,并且只覆盖了九个补丁的拉伸部分。

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

因为我将其标记为android-L,因为我正在开发一个。但我认为这应该是像姜饼这样的东西。(只是用其他东西替换波纹,也可能是插图等等。)

1 个答案:

答案 0 :(得分:6)

这种效果是由两件事的结合引起的:

  1. 所有九个补丁抽屉都有一个从内容区域边缘自动定义的填充区域。内容区域可以使用边框处的右边和底线明确定义,也可以使用左边和顶行定义的可伸缩区域隐式定义。

  2. 图层列表默认将每层上的填充应用于下一层 * ,有效地将每一层视为上一层的内容。

  3. * Lollipop引入了一个新的attribute来禁用此行为。