Shape:定义的几何形状的标签
属性:
android:shape
的子标签包括:
shape的颜色渐变效果
android:startColor
android:endColor
android:angle
android:type
shape的内部填充效果
android:color
shape的边缘线效果
android:width 边缘线的宽度
android:color 边缘线的颜色
android:dashWidth 边缘线用虚线,形如“- - - - - - - --”这样的形式。这个属性表示“-”小元素的宽度
android:dashGap边缘线用虚线,形如“- - - - - - - --”这样的形式。这个属性表示“-”小元素之间的间隔距离
shape的棱角圆弧效果(如果不设置该标签,将会默认为尖角效果)
android:radius
android:topRightRadius
android:bottomLeftRadius 右下圆角角半径
android:topLeftRadius 左上圆角半径
android:bottomRightRadius 左下圆角半径
shape的内补偿距离,也就是shape的内部填充物(比如颜色或者图片)距离shape的边缘的距离
android:bottom 底部补偿
android:left 左边补偿
android:right 右边补偿
android:top 上面补偿layer-list:将多个元素按照顺序逐层叠加
如下例子:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/ic_seekbar_background" >
</item>
<item
android:id="@android:id/progress">
<scale android:drawable="@drawable/ic_seekbar_progress" android:scaleWidth="100%" />
</item>
</layer-list>
Selector:选择器,内置开发者自己定义的<item>,系统会根据组件的状态选择相应的<item>来呈现。
直接这样解释可能不太好理解,举个例子来说明一下吧:
布局文件中有如下代码:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="54dp"
android:src="@drawable/my_selector" > --------------注释1
</ImageView>
my_selector.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/picture1" /> ----------------注释2
<item
android:drawable="@drawable/picture2"/> ---------------注释3
</selector>
上述例子中 image_view的注释1处声明了ImageView的呈现资源是my_selector.xml文件的内容。而在my_selector.xml文件中又声明了两种呈现:1.在按压状态下展示picture1这种图片;2.在默认状态下展示picture2这种图片。
那么当程序跑起来的时候,image_view首先展示的是注释3处的<item>的picture2这张默认图,当用户触摸image_view时,image_view会处于pressed状态,这是my_selector就会选择注释2出的<item>,呈现picture1了。
<item>标签的基础状态属性有如下:
android:state_selected 是否选中
android:state_focused 是否获得了焦点
android:state_pressed 是否被按下
android:state_enabled 是否可用
在实际应用中,不止存在以上这几种状态,还有很多由上述状态组合起来的复合状态,如下例子:
<?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 默认时的背景图片--> <item android:drawable="@drawable/pic1" /> <!-- 没有焦点时的背景图片 --> <item android:state_window_focused="false" android:drawable="@drawable/pic_blue" /> <!-- 非触摸模式下获得焦点并单击时的背景图片 --> <item android:state_focused="true" android:state_pressed="true" android:drawable= "@drawable/pic_red" /> <!-- 触摸模式下单击时的背景图片--> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pic_pink" /> <!--选中时的图片背景--> <item android:state_selected="true" android:drawable="@drawable/pic_orange" /> <!--获得焦点时的图片背景--> <item android:state_focused="true" android:drawable="@drawable/pic_green" /> </selector>
以上例子就是一些复合状态<item>的举例。但这个selector是绝对不可用的,这里需要开发者额外注意一下,下面来分析原因:
系统在selector寻找符合要求的item时是按照代码的顺序从上向下遍历的,一旦发现符合状态的item就直接使用它,并停止继续寻找!所以比如把
这样的item放在第一位的话,那在系统寻找item时,遍历到这个item,它没有指定特殊状态,必然符合状态要求(可以理解为万能钥匙),所以就会直接使用这个item而不再继续向下遍历了。<item android:drawable="@drawable/pic1" />
所以开发者在布置<item>时要注意一下:如果把这些状态理解成集合的话,那么位于下面的集合一定不要是上面某个集合的子集,否则是不会轮到下面这个集合出场的。