本文目录 ⌄
第二十三章 XML drawable
有关shape drawable
在drawable中新建文件,根元素是shape。使用android:shape可以指定形状:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/dark_blue"/>
</shape>有关state list drawable
在drawable中新建文件,根元素是selector,里面的每一个item标签可以对应组件的一种情况:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_button_beat_box_pressed" android:state_pressed="true"/> <item android:drawable="@drawable/ic_button_beat_box_default"/></selector>有关layout list drawable
修改之前的xml文件,使其的根元素为layer-list,其可以将多个XML drawable整合为一个,每一项用item标签修饰以作区分:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="oval"> <solid android:color="@color/red"/> </shape> </item> <item> <shape android:shape="oval"> <stroke android:width="4dp" android:color="@color/dark_red"/> </shape> </item></layer-list>有关9-patch图像
9-patch将图像分为九个部分,并且规定了四个角不可以被拉伸或收缩,四个处于边上的块可以沿着垂直于自身的方向拉伸,中间块可以随意拉伸:

运用到图片上是这样的:

有关挑战练习 按钮主题
题目给了提示:只有在Lollipop或更高的主题上才会有这种浮层效果,所以只需要在按钮的继承树上往上找究竟在哪个style上出现了备选资源:

发现v21是继承的android:Widget.Material.Button,多了一个stateListAnimator:
<style name="Widget.Material.Button"> <item name="background">@drawable/btn_default_material</item> <item name="textAppearance">?attr/textAppearanceButton</item> <item name="minHeight">48dip</item> <item name="minWidth">88dip</item> <item name="stateListAnimator">@anim/button_state_list_anim_material</item> <item name="focusable">true</item> <item name="clickable">true</item> <item name="gravity">center_vertical|center_horizontal</item></style>我的解决方法是让按钮再往上几层来继承,这样就可以跳过v21的备选资源,我选择的是android:Widget,需要手动补全Base.Widget.AppCompat.Button本来就有的属性:
<style name="BeatBoxButton" parent="android:Widget"> <item name="android:background">@drawable/button_beat_box</item> <item name="android:textAppearance">?android:attr/textAppearanceButton</item> <item name="android:minHeight">48dip</item> <item name="android:minWidth">88dip</item> <item name="android:focusable">true</item> <item name="android:clickable">true</item> <item name="android:gravity">center_vertical|center_horizontal</item></style>本来在想是否可以无视掉v21的备选资源,但是这种想法可能本身就违背了备选资源的意义;也想过重载v21版本的资源,但是要自己手写一个stateListAnimator所需要的动画,太麻烦了,所以就先到这了。