欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-23 09:40:52
本文实例讲述了android编程实现长按button按钮连续响应功能。分享给大家供大家参考,具体如下: 在电商类app的购物车页面,经常会有这样的需求:长按“+”按钮或者...

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

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

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

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

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程序设计有所帮助。

上一篇:

下一篇: