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