这篇文章主要介绍了Android编程实现长按Button按钮连续响应功能,涉及Android自定义按钮及事件响应操作相关技巧,需要的朋友可以参考下

本文实例讲述了Android编程实现长按Button按钮连续响应功能。分享给大家供大家参考,具体如下:

在电商类app的购物车页面,经常会有这样的需求:长按“+”按钮或者“-”按钮时,购物车中的商品数量连续的增加或减少。

本例的目的就是为了实现这个效果。预览图:

1.自定义Button.

/*** 长按连续响应的Button* Created by admin on 15-6-1.*/
public class LongClickButton extends Button {/*** 长按连续响应的监听,长按时将会多次调用该接口中的方法直到长按结束*/private LongClickRepeatListener repeatListener;/*** 间隔时间(ms)*/private long intervalTime;private MyHandler handler;public LongClickButton(Context context) {super(context);init();}public LongClickButton(Context context, AttributeSet attrs) {super(context, attrs);init();}public LongClickButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}/*** 初始化监听*/private void init() {handler = new MyHandler(this);setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {new Thread(new LongClickThread()).start();return true;}});}/*** 长按时,该线程将会启动*/private class LongClickThread implements Runnable {private int num;@Overridepublic void run() {while (LongClickButton.this.isPressed()) {num++;if (num % 5 == 0) {handler.sendEmptyMessage(1);}SystemClock.sleep(intervalTime / 5);}}}/*** 通过handler,使监听的事件响应在主线程中进行*/private static class MyHandler extends Handler {private WeakReference<LongClickButton> ref;MyHandler(LongClickButton button) {ref = new WeakReference<>(button);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);LongClickButton button = ref.get();if (button != null && button.repeatListener != null) {button.repeatListener.repeatAction();}}}/*** 设置长按连续响应的监听和间隔时间,长按时将会多次调用该接口中的方法直到长按结束** @param listener   监听* @param intervalTime 间隔时间(ms)*/public void setLongClickRepeatListener(LongClickRepeatListener listener, long intervalTime) {this.repeatListener = listener;this.intervalTime = intervalTime;}/*** 设置长按连续响应的监听(使用默认间隔时间100ms),长按时将会多次调用该接口中的方法直到长按结束** @param listener 监听*/public void setLongClickRepeatListener(LongClickRepeatListener listener) {setLongClickRepeatListener(listener, 100);}public interface LongClickRepeatListener {void repeatAction();}
}

2.在Activity中调用:

LongClickButton buttonSub = (LongClickButton) findViewById(R.id.long_click_button1);
LongClickButton buttonAdd = (LongClickButton) findViewById(R.id.long_click_button2);
final TextView numberTV = (TextView) findViewById(R.id.main_number);
//连续减
buttonSub.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() {@Overridepublic void repeatAction() {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));}
}, 50);
//连续加
buttonAdd.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() {@Overridepublic void repeatAction() {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1));}
}, 50);
//减1
buttonSub.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));}
});
//加1
buttonAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1));}
});

3.很多时候,长按的事件和普通点击的事件是一样的(也就是说,长按相当于连续的快速点击)。这种情况下,自定义Button可以更加简洁:即在长按时,连续的调用普通的OnClickListener。

public class LongClickButton2 extends Button {/*** 间隔时间(ms)*/private long intervalTime = 50;private MyHandler handler;public LongClickButton2(Context context) {super(context);init();}public LongClickButton2(Context context, AttributeSet attrs) {super(context, attrs);init();}public LongClickButton2(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}/*** 初始化监听*/private void init() {handler = new MyHandler(this);setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {new Thread(new LongClickThread()).start();return true;}});}/*** 长按时,该线程将会启动*/private class LongClickThread implements Runnable {private int num;@Overridepublic void run() {while (LongClickButton2.this.isPressed()) {num++;if (num % 5 == 0) {handler.sendEmptyMessage(1);}SystemClock.sleep(intervalTime / 5);}}}/*** 通过handler,使监听的事件响应在主线程中进行*/private static class MyHandler extends Handler {private WeakReference<LongClickButton2> ref;MyHandler(LongClickButton2 button) {ref = new WeakReference<>(button);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);LongClickButton2 button = ref.get();if (button != null) {//直接调用普通点击事件button.performClick();}}}public void setIntervalTime(long intervalTime) {this.intervalTime = intervalTime;}
}

Android编程实现长按Button按钮连续响应功能示例相关推荐

  1. android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能

    本文实例讲述了Android编程实现读取工程中的txt文件功能.分享给大家供大家参考,具体如下: 1. 众所周知,Android的res文件夹是用来存储资源的,可以在res文件夹下建立一个raw文件夹 ...

  2. mongodb android,Android编程连接MongoDB及增删改查等基本操作示例

    本文实例讲述了Android编程连接MongoDB及增删改查等基本操作.分享给大家供大家参考,具体如下: MongoDB简介 Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提 ...

  3. [.NET开发] C#编程调用Cards.dll实现图形化发牌功能示例

    本文实例讲述了C#编程调用Cards.dll实现图形化发牌功能.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; usi ...

  4. vue 点击文字input_vue input实现点击按钮文字增删功能示例

    本文实例讲述了vue input实现点击按钮文字增删功能.分享给大家供大家参考,具体如下: content="width=device-width, user-scalable=no, in ...

  5. Android 5.1长按电源键添加重启功能

    原址:http://blog.csdn.net/zhoumushui 现在长按Power键只有一个关机键,需要添加一个重启,以下是我的添加步骤: 1.在frameworks/base/core/res ...

  6. android 图片绑定按钮,Android编程实现给Button添加图片和文字的方法

    本文实例讲述了Android编程实现给Button添加图片和文字的方法.分享给大家供大家参考,具体如下: //为按钮添加图片和文字的方法 public Spanned getSpan(int id, ...

  7. Android的Button按钮,ACTION_UP事件不触发解决方案

    在android 编程时,有时候要实现当Button一直按下的时候,执行一些逻辑代码,当按钮弹起的时候,终止这些逻辑代码的执行. 比如在 设置页面的滑动开关时,如果不监听ACTION_CANCEL,在 ...

  8. android开发按钮颜色,Android编程实现简单设置按钮颜色的方法

    本文实例讲述了Android编程实现简单设置按钮颜色的方法.分享给大家供大家参考,具体如下: 1.工程目录 a.在res目录-新建drawble文件夹放入自定义图片 2.main.xml androi ...

  9. android 自定义控件 焦点,Android 自定义Button按钮显示样式(正常、按下、获取焦点)...

    现在的用户对APP的外观看得很重要,如果APP内所有元件都用Android默认样式写,估计下面评论里就有一堆在骂UI丑的.今天学习自定义Button按钮样式.Button样式修改的是Button的背景 ...

最新文章

  1. 成功部署SD-WAN策略应注意的几个事项—Vecloud微云
  2. 转载--tomcat整合apr
  3. 关于fragment backState的原理
  4. (java)短时间批量访问数据库(oracle)小结
  5. mysql 修复模式_Mysql表修复
  6. oracle中的to_number,Oracle中to_number()函数的用法
  7. 计算机网络协议到底分几层,一次讲清楚
  8. OI造数据以及Lemon评测教程
  9. 近12年的计算机考研408真题及答案解析分享
  10. iOS 不能播放远程视频(Android 可以)的问题
  11. ResNet之残差结构的理解
  12. 2014ACM/ICPC亚洲区域赛牡丹江现场赛总结
  13. Eclipse美观化代码
  14. 9条消除if...else的锦囊妙计,解决代码的坏味道!
  15. 配置管理神器 Viper
  16. 数字图像处理第九章笔记
  17. 如何更换文件夹图标、简洁有效地去除Windows 10快捷方式小箭头?
  18. Migrating to the New Material Buttons and their Themes
  19. 基于SSM图书管理系统
  20. python办公软件编程_python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)...

热门文章

  1. TCPDF:html文件转pdf格式
  2. 解析波士顿Handle机器人背后的技术
  3. Quartz定时任务总结
  4. 微软的APT服务器探针产品,网络探针介绍
  5. php微信支付结果通知接收,PHP接收微信支付结果通知 notify
  6. 数学分析教程史济怀练习6.7
  7. 美团的OCR方案介绍
  8. 【仪器仪表专题】案例:二极管测试反接万用表会显示1?
  9. 【聚宽本地数据JQData】【转载】使用fbprofhet对CF期货价格的预测
  10. The Illustrated Transformer