Android

Java安卓学习总结(二十七)

第二十三章 XML drawable

有关shape drawable

在drawable中新建文件,根元素是shape。使用android:shape可以指定形状:

qq screenshot 20200630195113
<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将图像分为九个部分,并且规定了四个角不可以被拉伸或收缩,四个处于边上的块可以沿着垂直于自身的方向拉伸,中间块可以随意拉伸:

image 171

运用到图片上是这样的:

image 172

有关挑战练习 按钮主题

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

image 173

发现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所需要的动画,太麻烦了,所以就先到这了。

发表评论