Android控件篇03之 Button(二)样式

本章包含两部分内容:
1. Button样式
2. selector和shape

点击查看"Button示例源码"。

1. Button样式

Button的样式可以分为3类:
(01) 使用Android系统自带的Button样式。
(02) 使用jpg/png等图片。
(03) 自定义shape。

1.1 使用Android系统自带的Button样式

在定义Button时,使用android自带的Button样式。如下所示:

<Button
    android:id="@+id/bt_style"
    android:layout_width="wrap_content"          
    android:layout_height="wrap_content"         
    android:text="@string/bt_style"
    style="?android:attr/borderlessButtonStyle"  
    android:textSize="12sp" />

说明:上面是创建一个无边框按钮。当然,也可以去掉style或将style换成其他的值。
(01) 若去掉的话,则使用Android默认的样式。
(02) 若要换成其他的值,可以在frameworks/base/core/res/res/values/public.xml中查看Button支持的style样式。

1.2 使用图片

首先,在定义Button时,通过"android:background"属性指定Button的背景图。

<Button
    android:id="@+id/bt_sync"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/bt_sync"
    android:background="@drawable/button_custom"
    android:textSize="12sp" />

说明:android:background="@drawable/button_custom",这意味着按钮的背景是drawable下的button_custom文件。下面是button_custom.xml的内容。

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

    <!-- Android系统在处理下面的状态时,是按照它们定义的先后顺序进行处理的 -->

    <!-- 按钮按下 -->
    <item android:drawable="@drawable/ic_sync_red"   
          android:state_pressed="true" />

    <!-- 按钮获取焦点 -->
    <item android:drawable="@drawable/ic_sync_green"
          android:state_focused="true" />

    <!-- 默认 -->
    <item android:drawable="@drawable/ic_sync_grey" />

</selector>

说明:需要注意的是,系统会根据状态定义的先后顺序对这些状态进行处理!ic_sync_red.png, ic_sync_green.png, ic_sync_grey.png是drawable目录下的三种图片。

1.3 自定义shape

关于自定义shape,这里给出3个示例进行介绍。

shape示例一

自定义Button背景:未按下的时候是灰色的圆角矩形,按下的时候是深灰色的圆角矩形。

button的定义如下

<Button
    android:id="@+id/bt_diy"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_btn_gray_pressed_dkgray"
    android:text="shape_01"
    android:textSize="12sp" />

bg_btn_gray_pressed_dkgray.xml的内容如下

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

    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <corners android:radius="8dip"/>
            <solid android:color="#ffcccccc"/>
        </shape>  
    </item>

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="8dp"/>
            <solid android:color="#ff666666"/>
        </shape>
    </item>
</selector>

shape示例二

自定义Button背景:未按下的时候是黑边的透明圆角矩形框,按下的时候是黑边的灰色圆角矩形。

button的定义如下

<Button
    android:id="@+id/bt_diy"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_btn_black_frame"
    android:text="shape_02"
    android:textSize="12sp" />

bg_btn_black_frame.xml的内容如下

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

    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <corners android:radius="8dip"/>
            <stroke android:width="1dip" android:color="#ff000000" />
            <solid android:color="#00ffffff"/>
        </shape>  
    </item>

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="8dp"/>
            <stroke android:width="1dip" android:color="#ff000000" />
            <solid android:color="#22000000"/>
        </shape>
    </item>
</selector>

shape示例三

自定义Button背景:红色圆环

button的定义如下

<Button
    android:id="@+id/bt_diy"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_btn_ring"
    android:text="shape_03"
    android:textSize="12sp" />

bg_btn_black_frame.xml的内容如下

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#ffffff" />
        </shape>
    </item>

    <item>
        <!-- 
             android:innerRadiusRatio="8" 表示"圆环半径=圆环宽度/8"
             android:thicknessRatio="10" 表示"圆环厚度=圆环宽度/10"
         -->
        <shape
            android:shape="ring"
            android:innerRadiusRatio="8"
            android:thicknessRatio="10"
            android:useLevel="false" >
            <solid android:color="#660000" />
            <size
                android:height="32dip"
                android:width="32dip" />
        </shape>
    </item>
</layer-list>

2. selector和shape

2.1 selector

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

    <!-- 按下状态:(01) true表示按下,例如,Button被按下; (02) false表示非按下。 -->
    <item android:state_pressed="true/false" android:drawable="@drawable/exam01" />

    <!-- 聚焦状态:(01) true表示获取焦点; (02) false表示非获取焦点。 -->
    <item android:state_focused="true/false" android:drawable="@drawable/exam01" />

    <!-- 选中状态:(01) true表示选中,例如,Tab被选中; (02) false表示非选中。 -->
    <item android:state_selected="true/false" android:drawable="@drawable/exam01" />

    <!-- 可勾选状态:(01) true表示可勾选; (02) false表示不可勾选。 -->
    <item android:state_checkable="true/false" android:drawable="@drawable/exam01" />

    <!-- 选中状态:(01) true表示选中,例如,checkbox被选中; (02) false表示非选中。 -->
    <item android:state_checked="true/false" android:drawable="@drawable/exam01" />

    <!-- 使能状态:(01) true表示可用; (02) false表示不可用。 -->
    <item android:state_enabled="true/false" android:drawable="@drawable/exam01" />

    <!-- 焦点状态:(01) true表示获取焦点; (02) false表示可获取焦点。 -->
    <item android:state_window_focused="true/false" android:drawable="@drawable/exam01" />

</selector>

2.2 shape

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >   --- 默认为rectangle
    android:innerRadius="dimension"  -- ring专用,内圆环的半径大小。设置innerRadius时,会忽略innerRadiusRatio
    android:innerRadiusRatio="float" -- ring专用,内圆环的半径比例。例如,比例为10表示"内圆环的半径大小=圆环宽度/10"
    android:thickness="dimension"    -- ring专用,内圆环的厚度大小。设置thickness时,会忽略thicknessRatio
    android:thicknessRatio="float"   -- ring专用,内圆环的厚度比例。例如,比例为10表示"内圆环的厚度大小=圆环宽度/10"
    android:useLevel="true|false"  -- true表示将该形状当作LevelListDrawable
    <size    -- 大小
        android:width="dimension"
        android:height="dimension" />
    <gradient  -- 渐变
        android:type=["linear" | "radial" | "sweep"] -- 渐变类型:线性,径向,扫描
        android:angle="float"   
        android:startColor="color"
        android:centerColor="color"  -- 中心点颜色
        android:endColor="color"
        android:centerX="float|fraction"  -- 中心点X坐标
        android:centerY="float|fraction"  -- 中心点Y坐标
        android:gradientRadius="float|fraction" -- 径向渐变的半径
        android:useLevel=["true" | "false"] />
    <corners  -- shape=“rectangle”时使用, 
        android:radius="dimension"  -- 四个角的半径
        android:topLeftRadius="dimension"
        android:topRightRadius="dimension"
        android:bottomLeftRadius="dimension"
        android:bottomRightRadius="dimension" />
    <padding  -- 内容与边框的距离
        android:left="dimension"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension" />
    <solid    -- 填充颜色
        android:color="color" />
    <stroke    -- 指定边框
        android:width="dimension"
        android:color="color"
        android:dashWidth="dimension"    -- 虚线宽度
        android:dashGap="dimension" />    -- 虚线间隔宽度
</shape>
by skywang
Previous     Next