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

 更新时间:2017年01月21日 12:02:48   作者:books1958  
这篇文章主要介绍了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() {
      @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实现手势控制ImageView图片大小

    Android实现手势控制ImageView图片大小

    这篇文章主要介绍了Android实现手势控制ImageView图片大小的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android架构组件LiveData使用详解

    Android架构组件LiveData使用详解

    这篇文章主要介绍了Android架构组件LiveData使用详解的相关资料,需要的朋友可以参考下
    2023-07-07
  • Handler实现线程之间的通信下载文件动态更新进度条

    Handler实现线程之间的通信下载文件动态更新进度条

    每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息。这篇文章主要介绍了Handler实现线程之间的通信下载文件动态更新进度条,需要的朋友可以参考下
    2017-08-08
  • Android实现屏幕录制功能

    Android实现屏幕录制功能

    这篇文章主要为大家详细介绍了Android实现屏幕录制功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Android自定义星星可滑动评分控件

    Android自定义星星可滑动评分控件

    这篇文章主要介绍了Android自定义星星可滑动评分控件,通过线性布局结合ImageView实现评分控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 全面解析Android应用开发中Activity类的用法

    全面解析Android应用开发中Activity类的用法

    这篇文章主要介绍了Android应用开发中Activity类的用法,包括Activity间的数据传递以及Activity的创建方式等,需要的朋友可以参考下
    2016-02-02
  • Android中Fragment管理及重叠问题的解决方法

    Android中Fragment管理及重叠问题的解决方法

    最近做项目碰到了Fragment重叠的问题,后来通过种种方法得以解决了,所以想着总结下这个问题的解决方法,以及Android中Fragment的管理,方便自己也给有需要的朋友们提供以帮助,感兴趣的朋友们下面通过这篇文章一起来学习学习吧。
    2016-11-11
  • Android一次性退出多个Activity的方法

    Android一次性退出多个Activity的方法

    这篇文章主要介绍了Android一次性退出多个Activity的方法,结合实例形式分析了Activity的创建,继承,遍历与关闭等实现步骤与相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android程序开发如何处理图像格式类及图像转换

    Android程序开发如何处理图像格式类及图像转换

    这篇文章主要介绍了Android程序开发如何处理图像格式类及图像转换,需要的朋友可以参考下
    2015-07-07
  • 详解Android微信登录与分享

    详解Android微信登录与分享

    本篇文章主要对Android微信登录与分享功能的实现进行了介绍。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论