1.Selector

item是从上往下匹配的,如果匹配到一个item那它就将采用这个item,后面的就会忽略,而不是采用最佳匹配的规则;所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了。

drawable的item中可以有以下属性:

selector一般使用四种状态:
android:state_focused
android:state_pressed
android:state_selected
android:state_enabled

  • android:state_pressed=[“true” | “false”]
    “true”表示按下状态使用(例如按钮按下);“false”
    表示非按下状态使用。
  • android:state_focused=[“true” | “false”]
    “true”表示按下状态使用(例如按钮按下);“false”
    表示非按下状态使用。
  • android:state_selected=[“true” | “false”]
    “true”表示选中状态使用(例如Tab 打开);“false”
    表示非选中状态使用。
  • android:state_active=[“true” | “false”]
    设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的setActivated(boolean)方法设置是否激活该控件
  • android:state_checkable=[“true” | “false”]
    “true”表示可勾选状态时使用;“false”表示非可
    勾选状态使用。
  • android:state_checked=[“true” | “false”]
    “true”表示勾选状态使用;“false”表示非勾选
    状态使用。
  • android:state_enabled=[“true” | “false”]
    “true”表示可用状态使用(能接收触摸/点击事件);
    “false”表示不可用状态使用。
  • android:state_window_focused=[“true” | “false”]
    “true”表示应用程序窗口有焦点时使用(应用程序
    在前台);“false”表示无焦点时使用(例如Notification栏拉
    下或对话框显示)。

这篇文章有详细介绍:

2.shape

这篇文章介绍的很细,还有实例:
这篇文章细节方面不错:
还有就是这篇文章有个地方解决了我一个贼烦心的bug:

size: width,height,通常shape都是作为background的,所以这个size通常不会有效,而是控件的宽高为准,当然,当作为imageview的src的时候,这个size默认还是会有用的.

就是这里,我想添加一个白色的十字加号,结果导致整个布局都成了白色,最后解决结果是用的item的right,button。。。。。之类的,对于这里我还不是很明白,如果各位有什么高见或者更好的解决办法,可以留言。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 圆角 -->
    <corners
        <!-- radius与其它四个并不能共同使用 ->
        android:radius="9dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp"
        android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"/><!-- 设置圆角半径 -->

    <!-- 渐变 -->
    <gradient
        <!-- 渐变起始点,中间点和结束点颜色 -->
        android:startColor="@android:color/white"
        android:centerColor="@android:color/black"
        android:endColor="@android:color/black"
        <!-- 使用LevelListDrawable时就要设置为true。设为false时才有渐变效果 -->
        android:useLevel="true"
        <!-- 渐变角度,必须为45的整数倍 -->
        android:angle="45"
        <!-- 渐变默认的模式为android:type="linear",即线性渐变,还有radial(放射性渐变)、sweep(扫描式渐变)-->
        <!-- 可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientRadius -->
        android:type="radial"
        android:gradientRadius="90"
        <!-- //渐变中心X,y的相当位置,范围为0-1 -->
        android:centerX="0"
        android:centerY="0"/>

    <!-- 间隔 -->
    <padding
        android:left="2dp"
        android:top="2dp"
        android:right="2dp"
        android:bottom="2dp"/><!-- 各方向的间隔 -->

    <!-- 大小 -->
    <size
        android:width="50dp"
        android:height="50dp"/><!-- 宽度和高度 -->

    <!-- 填充 -->
    <solid
        android:color="@android:color/white"/><!-- 填充的颜色 -->

    <!-- 描边 -->
    <stroke
        android:width="2dp"
        android:color="@android:color/black"
        <!-- 虚线的宽度,值为0时是实线 -->
        android:dashWidth="1dp"
        <!-- 虚线的间隔 -->
        android:dashGap="2dp"/>

</shape>
  • 填充solid:设置填充的颜色
  • 间隔padding:设置四个方向上的间隔
  • 大小size:设置大小
  • 圆角corners:同时设置五个属性,则Radius属性无效
    android:Radius=”20dp” 设置四个角的半径
    android:topLeftRadius=”20dp” 设置左上角的半径
    android:topRightRadius=”20dp” 设置右上角的半径
    android:bottomLeftRadius=”20dp” 设置右下角的半径
    android:bottomRightRadius=”20dp” 设置左下角的半径
  • 描边stroke:dashWidth和dashGap属性,只要其中一个设置为0dp,则边框为实现边框
    android:width=”20dp” 设置边边的宽度
    android:color=”@android:color/black” 设置边边的颜色
    android:dashWidth=”2dp” 设置虚线的宽度
    android:dashGap=”20dp” 设置虚线的间隔宽度
  • 渐变gradient:当设置填充颜色后,无渐变效果。angle的值必须是45的倍数(包括0),仅在type=”linear”有效,不然会报错。
    angle对应值的起点如图:
  • android studi弹框proxy settings_2d

除了上面的属性之外,shape本身也是可以设置自身的形状的:

android:shape=["rectangle" | "oval" | "line" | "ring"]

1、rectangle (矩形):当我们不指定shape属性时,默认就是矩形的。
2、oval(椭圆)
3、line(线形)
4、ring(环形)

//下面的属性只有在android:shape="ring时可用:    
android:innerRadius         尺寸,内环的半径。    
android:innerRadiusRatio    浮点型,以环的宽度比率来表示内环的半径
android:thickness           尺寸,环的厚度    
android:thicknessRatio      浮点型,以环的宽度比率来表示环的厚度
android:useLevel            boolean值,如果当做是LevelListDrawable使用时值为true,否则为false.