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

为什么Android图层列表绘制如此智能?,android,android-layout,drawable,android-5.0-lollipop,nine-patch,Android,Android Layout,Drawable,Android 5.0 Lollipop,Nine Patch,我无法深入了解android是如何实现其层列表可绘制的。但我觉得这很有趣,我几乎不知道为什么会发生这种情况 以下是一些可抽出式: 九补丁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

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

以下是一些可抽出式:

九补丁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>

不幸的是,我仍然无法在我的L预览中使用截图,但我可以描述它

我得到的是形状(我显然没有明确设置它的大小)没有覆盖整个九块补丁!九块补丁中未拉伸的部分被神奇地认为是某种“自动填充的东西”。我所期待的(好吧,我期待的正是安卓为我所做的,我指的是我……假设……)是不是有点不那么积极:不是特别大的形状可拉伸覆盖整个九补丁,就像后者是一个正常的png

但形状确实神奇地避开了九块补丁中未拉伸的部分,并且仅覆盖在九块补丁的拉伸部分之上

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


因为我正在开发一款android-L,所以我将其标记为android-L。但我认为这应该是从姜饼之类的东西开始开发的。(只是为了用其他东西代替ripple drawable,可能是嵌入式drawable等)

这一效果是由两种东西的组合造成的:

  • 所有九个patch Drawable都有一个从内容区域边缘自动定义的填充区域。内容区域可以使用边界处的右行和底行显式定义,也可以从左行和顶行定义的可拉伸区域隐式定义

  • 默认情况下,“层列表”将每个层上的填充累积应用于下一层*,有效地将每个层视为上一层的内容


  • *棒棒糖引入了一种新的方法来禁用这种行为。

    您看到的效果是由以下事实造成的:如果没有明确定义,九个面片可绘制对象会自动从边缘的不可拉伸区域隐式定义其填充,并且层列表会在后续l上累积应用前一层的填充ayers。当从多个部分创建绘图时,这种组合非常有用。@corsair992这真的很有帮助和有用。我知道该功能确实来自某个方面,但从未找到它的位置。很高兴知道9-patch-drawable是可行的。你可以回答这个问题,因此我应该选择它作为公认的答案。