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的详细教程