安卓开发学习之014 Button应用详解(样式、背景、按钮单击、长按、双击、多击事件)

一、Button简介

按钮也是继承自TextView
这里写图片描述

二、XML定义方法

<Button
            android:id="@+id/button01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button_Click"/>

id设置按钮唯一编号
text设置按钮上显示的文本

三、设置按钮背景图片

使用background属性设置背景图片

 <!-- 背景设置-->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/yxs"
        android:text="Background"/>

四、设置样式

主要是定义按钮三种状态下分别对应的背景样式
默认状态、获得焦点(android:state_focused=“true”)、
按下时(android:state_pressed=“true”)

 <!-- 使用单一shape定义样式-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_border"
            android:text="Button_Shape"/>

        <!-- 使用selector定义样式,其中包括三种状态下的shape-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button_selector"
            android:text="Button_Selector1"/>

        <!-- 使用selector定义样式,其中包括三种状态下所使用的图片-->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/selector_button_start"
            android:text="Button_Selector2"/>

三个文件drawable文件代码如下:

1.res/drawable/bg_border.xml

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

    <!-- 圆角 -->
    <corners
        android:radius="10dp"/>
    <!-- 设置圆角半径 -->

    <!-- 渐变 -->
    <gradient

        android:centerColor="#00ff00"
        android:endColor="#0000ff"
        android:startColor="#ff0000"
        android:type="linear"
        />

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

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

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

    <!-- 描边 -->
    <stroke
        android:width="2dp"
        android:color="#f0f"
        />

</shape>

2.res/drawable/button_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--按下时样式-->
    <item android:state_pressed="true">
        <shape>
            <!-- 描边 -->
            <stroke
                android:width="2dp"
                android:color="#fad3cf"/>
            <solid android:color="#87CEFF"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
            <!--  圆角 -->
            <corners
                android:bottomLeftRadius="10dp"
                android:bottomRightRadius="10dp"
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"/>
        </shape>
    </item>

    <!-- 获得焦点时样式-->
    <item android:state_focused="true">
        <shape>
            <gradient
                android:angle="270"
                android:centerColor="#00ff00"
                android:endColor="#ffc2b7"
                android:startColor="#f0f"
                android:type="sweep"/>
            <stroke
                android:width="2dp"
                android:color="#dcdcdc"/>
            <corners
                android:bottomLeftRadius="10dp"
                android:bottomRightRadius="10dp"
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
        </shape>
    </item>
    <!-- 默认样式-->
    <item>
        <shape>
            <!--  渐变 -->
            <gradient
                android:centerColor="#00ff00"
                android:endColor="#FFFFFF"
                android:startColor="#ff8c00"
                android:type="linear"/>
            <!-- 描边 -->
            <stroke
                android:width="2dp"
                android:color="#dcdcdc"
                android:dashGap="3dp"
                android:dashWidth="5dp"/>
            <!--  圆角 -->
            <corners
                android:bottomLeftRadius="10dp"
                android:bottomRightRadius="10dp"
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
            <!--<solid android:color="#ffc2b7"/>-->
        </shape>
    </item>

</selector>

效果如下:
这里写图片描述
这里写图片描述
这里写图片描述

3.res/drawable/selector_button_start.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@mipmap/search_bar_edit_pressed" android:state_pressed="true"/>
    <item android:drawable="@mipmap/button_start_click" android:state_focused="true"/>
    <item android:drawable="@mipmap/search_bar_edit_normal"></item>
</selector>

四、按钮点击事件的处理方式

按钮点击有四种处理方法。
第一种是通过onClick属性,通过这个属性设置处理点击事件的方法名,在Activity中实现这个方法。
第二种是典型的事件监听机制setOnClickListener的应用形式,下面详细说明这四种方法。

1.通过onClick属性设置处理方法

  在XML布局文件中设置Button的属性:
  android:onClick=”yourMethodName”
  然后在该布局文件对应的Acitivity中实现该方法:
需要注意的是这个方法必须符合三个条件:
1.public
2.返回void
3.只有一个参数View,这个View就是被点击的这个控件。
也可为多个Button设置同一个方法名,然后在方法内使用switch方法判断点击的是哪个按钮

如下:

<Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button_selector"
            android:onClick="MyClick"
            android:text="Button_onClick"/>

java代码中

    /**
     * 在XML中配置置android:onClick="MyClick"
     * 必须设置为public void
     */

    public void MyClick(View view) {
//        switch (view.getId())
//        {
//           //TODO
//        }
        Toast.makeText(ButtonActivity.this, "android:onClick=\"MyClick\"", Toast.LENGTH_SHORT)
                .show();
    }

2.使用setOnClickListener添加监听器对象

Button button01 = (Button) findViewById(R.id.button01);
        //短按点击事件监听

        button01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this, "OnClickListener", Toast.LENGTH_SHORT).show();
            }
        });

此种方法还有几个变种:
1.自定义类实现OnClickListener接口

//自定义类实现OnClickListener接口
    private MyOnClickListener mOnClickListener = new MyOnClickListener();

    private class MyOnClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                //TODO
            }
        }
    }
然后调用
button01.setOnClickListener(mOnClickListener);
button02.setOnClickListener(mOnClickListener);

此种方法的好处是当多个按钮要处理的事件逻辑是一样的话,不用每个按钮都写一个setOnClickListener监听事件,并实现Onclick方法

2.使Activity实现OnClickListener接口,并在Activity中实现Onclick方法

public class ButtonActivity extends AppCompatActivity implements View.OnClickListener{
 @Override
        public void onClick(View v) {
            switch (v.getId()) {
                //TODO
            }
        }
}

3.长按事件监听

//长按(长按2秒以上)点击事件监听
        button01.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(ButtonActivity.this, "OnLongClickListener", Toast.LENGTH_SHORT)
                        .show();
                return true;
            }
        });

五、双击事件判定

主要代码如下

    private static int DOUBLE_CLICK_TIME = 1000;
    private List<Long> times = new ArrayList<>();
    private Handler mHandler = new Handler();

    private Runnable r;

  /**双击事件判断*/
    private boolean isDoubleClick() {
        if (times.size() == 2) {
            //已经完成了一次双击,list可以清空了
            if (times.get(times.size() - 1) - times.get(0) < DOUBLE_CLICK_TIME) {
                times.clear();
                Toast.makeText(ButtonActivity.this, "双击", Toast.LENGTH_SHORT).show();
                if (mHandler != null) {
                    if (r != null) {
                        //移除回调
                        mHandler.removeCallbacks(r);
                        r = null;
                    }
                }
                return true;
            } else {
                //这种情况下,第一次点击的时间已经没有用处了,第二次就是“第一次”
                times.remove(0);
            }

        }
        //此处可以添加提示
        //showTips();
        r = new Runnable() {
            @Override
            public void run() {
                Toast.makeText(ButtonActivity.this, "单击", Toast.LENGTH_SHORT).show();
            }
        };
        //DOUBLE_CLICK_TIME时间后提示单击事件
        mHandler.postDelayed(r, DOUBLE_CLICK_TIME);
        return false;
    }

使用方法:在onClick(View v)方法中调用

 Button button02 = (Button) findViewById(R.id.button02);
        button02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                times.add(SystemClock.uptimeMillis());

                isDoubleClick();

            }
        });

六、多击事件

 /**多击事件判断*/

    private boolean isMultiClick() {
        int size = times.size();

        //处理多击事件
        if (size > 1) {

            if (times.get(size - 1) - times.get(size - 2) < DOUBLE_CLICK_TIME) {
                Toast.makeText(ButtonActivity.this, size + "连击", Toast.LENGTH_SHORT).show();
                if (mHandler != null) {
                    if (r != null) {
                        //移除回调
                        mHandler.removeCallbacks(r);
                    }
                }
                return true;
            } else {
                //这种情况下,以前存储的点击的时间已经没有用处了,最后一次就是“第一次”
                long oldtime = times.get(size - 1);
                times.clear();
                times.add(oldtime);
            }

        }
        //此处可以添加提示
        //showTips();
        r = new Runnable() {
            @Override
            public void run() {
                Toast.makeText(ButtonActivity.this,"单击", Toast.LENGTH_SHORT).show();
            }
        };
        //DOUBLE_CLICK_TIME时间后提示单击事件
        mHandler.postDelayed(r, DOUBLE_CLICK_TIME);
        return false;
    }

效果如下:
这里写图片描述

开发工具:Android Studio1.4
SDK: Android 6.0
API 23

代码下载:Button.zip

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanxiaochengyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值