drawable中shape,selector,layer-list的使用
<shape>
用于设置控件的自身属性的效果形状,这些效果不会因为状态的改变而改变,比如圆形,圆角,边框效果等等。
顾名思义就是选择器,所以使用Selector设置的是跟状态有关的效果,比如点击时,获取焦点时,选中时等所展现的控件效果。
用于控件效果的层叠。每一个item都可以实现独立的效果,比如shape或者selector,甚至item中也可以再包含一个layer-list。
有了总体概念,我们一一来分析各个drawable的使用格式:
一,<shape>属性
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/holo_purple"/>
<corners android:radius="20dp"/>
<gradient
android:centerColor="@android:color/holo_purple"
android:endColor="@android:color/holo_blue_dark"
android:startColor="@android:color/holo_blue_light"/>
</shape>
<shape>属性的设置比较中规中矩,没有什么特别好说的,只要你跟着属性设置规则走就行了。
<shape>常用属性如下:
<shape> android:shape=["rectangle" | "oval" | "line" | "ring"] 其中rectagle矩形,oval椭圆,line水平直线,ring环形<shape>中子节点的常用属性:
<gradient> 设置渐变
android:startColor 起始颜色
android:endColor 结束颜色
android:angle 渐变角度,0从左到右,90表示从下到上,数值为45的整数倍,默认为0;
android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep
<solid > 设置填充
android:color 填充的颜色
<stroke >描边
android:width 描边的宽度
android:color 描边的颜色
android:dashWidth 表示'-'横线的宽度 虚线
android:dashGap 表示'-'横线之间的距离 虚线
<corners >圆角
android:radius 圆角的半径 值越大角越圆
android:topRightRadius 右上圆角半径
android:bottomLeftRadius 右下圆角角半径
android:topLeftRadius 左上圆角半径
android:bottomRightRadius 左下圆角半径
<padding >填充
android:bottom="1.0dip" 底部填充
android:left="1.0dip" 左边填充
android:right="1.0dip" 右边填充
android:top="0.0dip" 上面填充
shape取值有四种,可以是rectangle(长方形),oval(椭圆),line(线条),ring(圆环),如果设置的话默认是长方形,
只有当我们要画的图形是ring的时候,下面这几个属性才会生效:
android:innerRadius:内环的半径。
android:innerRadiusRatio:内环的比例,比如这个值为2,那么内环的半径就为环半径除以2,如果设置了第一个属性,则这个属性不起作用。
android:thickness:环的厚度。
android:thicknessRatio:环的厚度比例,比如这个值为2,那么环的厚度就为环半径除以2,如果设置了第三个属性,则这个属性不起作用。
android:useLevel:只有当我们的shape使用在LevelListDrawable中的时候,这个值为true,否则为false。
二,<selector>属性
在drawable中配置Android的selector。<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 默认情况,item必须放在最后 -->
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->
<item
android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/ic_launcher"
/>
<!-- 触摸模式下单击时的背景图片-->
<item
android:state_focused="false"
android:state_pressed="true"
android:drawable="@drawable/ic_launcher"
/>
<!--选中时的图片背景-->
<item
android:state_selected="true"
android:drawable="@drawable/ic_launcher"
/>
<!--获得焦点时的图片背景-->
<item
android:state_focused="true"
android:drawable="@drawable/ic_launcher"
/>
<item
android:drawable="@drawable/button_bg_default"
/>
</selector>
第一种方法是在listview配置文件中配置,代码如下:android:listSelector="@drawable/item_bg"
第二种方法是在listview的item中添加属性,代码如下:android:background=“@drawable/item_bg"
第三种方法是在java代码中设置,代码如下:Drawable drawable =getResources().getDrawable(R.drawable.item_bg); ListView.setSelector(drawable);
上面的设置方法显示效果有时候为黑,所以需要在配置文件上加上如下代码:android:cacheColorHint="@android:color/transparent" 使其背景是透明的。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 当前窗口失去焦点时 -->
<item android:drawable="@drawable/bg_btn_lost_window_focused" android:state_window_focused="false" />
<!-- 不可用时 -->
<item android:drawable="@drawable/bg_btn_disable" android:state_enabled="false" />
<!-- 按压时 -->
<item android:drawable="@drawable/bg_btn_pressed" android:state_pressed="true" />
<!-- 被选中时 -->
<item android:drawable="@drawable/bg_btn_selected" android:state_selected="true" />
<!-- 被激活时 -->
<item android:drawable="@drawable/bg_btn_activated" android:state_activated="true" />
<!-- 默认时 -->
<item android:drawable="@drawable/bg_btn_normal" />
</selector>
三,<layer-list>属性
将多个图片或上面两种效果按照顺序层叠起来<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="@android:color/holo_red_light" />
</shape>
</item>
<item
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp">
<shape android:shape="rectangle">
<solid android:color="@android:color/background_light" />
</shape>
</item>
<item>
<selector>
<item android:state_pressed="true">
<transition
android:opacity="transparent"
android:paddingBottom="30dp"
android:paddingLeft="10dp">
<item android:drawable="@android:drawable/ic_delete" />
</transition>
</item>
<item android:state_selected="false">
<animated-rotate
android:drawable="@android:drawable/dark_header"
android:pivotX="30%"
android:pivotY="70%"
android:visible="true" />
</item>
</selector>
</item>
</layer-list>
ayer-list就更加灵活了,每一个item都是独立存在的,都可以独当一面,然后item可以包含任何的上面所说的效果设置!当然也包括layer-list自己本身。
而item自身的属性中有各种left,gravity,width等属性跟我们平时在布局文件中使用的是一个意思,只是这次的对象是那些drawable图层罢了。
最后要注意的是由于是层叠效果,所以后面的总是覆盖前面的。就比如上面的例子,如果把selector的属性挪到前面,那么动画就会被挡住。
selector 和 layer-list 结合
实现选项卡的效果
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 第一种加载方式 -->
<!--<item android:drawable="@drawable/bg_tab_selected" android:state_checked="true" />-->
<!-- 第二种加载方式 -->
<item android:state_checked="true">
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="4dp" android:drawable="@android:color/white" />
</layer-list>
</item>
<item>
<layer-list>
<!-- 红色背景 -->
<item>
<color android:color="#E4007F" />
</item>
<!-- 白色背景 -->
<item android:bottom="1dp" android:drawable="@android:color/white" />
</layer-list>
</item>
</selector>
以下是带阴影的圆角矩形:<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 灰色阴影 -->
<item
android:left="2dp"
android:top="4dp">
<shape>
<solid android:color="@android:color/darker_gray" />
<corners android:radius="10dp" />
</shape>
</item>
<!-- 白色前景 -->
<item
android:bottom="4dp"
android:right="2dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 灰色阴影 -->
<item
android:left="2dp"
android:top="4dp">
<shape>
<solid android:color="@android:color/darker_gray" />
<corners android:radius="10dp" />
</shape>
</item>
<!-- 白色前景 -->
<item
android:bottom="4dp"
android:right="2dp">
<shape>
<solid android:color="#FFFFFF" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>