Android编程实现长按Button按钮连续响应功能示例
发布时间 - 2026-01-10 22:42:10 点击率:次本文实例讲述了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() {
@Override
public boolean onLongClick(View v) {
new Thread(new LongClickThread()).start();
return true;
}
});
}
/**
* 长按时,该线程将会启动
*/
private class LongClickThread implements Runnable {
private int num;
@Override
public 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);
}
@Override
public 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() {
@Override
public void repeatAction() {
numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));
}
}, 50);
//连续加
buttonAdd.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() {
@Override
public void repeatAction() {
numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1));
}
}, 50);
//减1
buttonSub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));
}
});
//加1
buttonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public boolean onLongClick(View v) {
new Thread(new LongClickThread()).start();
return true;
}
});
}
/**
* 长按时,该线程将会启动
*/
private class LongClickThread implements Runnable {
private int num;
@Override
public 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);
}
@Override
public 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相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
# Android
# 长按
# Button按钮
# 连续响应
# Android使用addView动态添加组件的方法
# android ListView内数据的动态添加与删除实例代码
# Android动态添加menu菜单的简单方法
# 在Android中动态添加Panel框架的实现代码
# Android 动态添加Fragment的实例代码
# Android用RecyclerView实现动态添加本地图片
# Android动态添加view的方法示例
# Android实现圆角Button按钮
# Android开发中button按钮的使用及动态添加组件方法示例
# 将会
# 自定义
# 进阶
# 会有
# 相关内容
# 感兴趣
# 给大家
# 购物车
# 更多关于
# 解决方法
# 所述
# 即在
# 程序设计
# 车中
# 本例
# 也就是说
# 情况下
# 操作技巧
# 直接调用
# 讲述了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建高效香港服务器网站?
如何用wdcp快速搭建高效网站?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
什么是javascript作用域_全局和局部作用域有什么区别?
潮流网站制作头像软件下载,适合母子的网名有哪些?
原生JS获取元素集合的子元素宽度实例
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
jQuery validate插件功能与用法详解
Java遍历集合的三种方式
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
成都网站制作公司哪家好,四川省职工服务网是做什么用?
详解vue.js组件化开发实践
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
javascript中的try catch异常捕获机制用法分析
Laravel如何为API编写文档_Laravel API文档生成与维护方法
香港服务器WordPress建站指南:SEO优化与高效部署策略
Python进程池调度策略_任务分发说明【指导】
网站建设整体流程解析,建站其实很容易!
如何在建站主机中优化服务器配置?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
Laravel如何使用Blade组件和插槽?(Component代码示例)
Python文件流缓冲机制_IO性能解析【教程】
详解Huffman编码算法之Java实现
高端企业智能建站程序:SEO优化与响应式模板定制开发
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel怎么为数据库表字段添加索引以优化查询
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
PHP正则匹配日期和时间(时间戳转换)的实例代码
深入理解Android中的xmlns:tools属性
Laravel怎么清理缓存_Laravel optimize clear命令详解
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
在centOS 7安装mysql 5.7的详细教程

