Welcome

首页 / 移动开发 / Android / Android编程实现长按Button按钮连续响应功能示例

本文实例讲述了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() {@Overridepublic boolean onLongClick(View v) {new Thread(new LongClickThread()).start();return true;}});}/** * 长按时,该线程将会启动 */private class LongClickThread implements Runnable {private int num;@Overridepublic 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);}@Overridepublic 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() {@Overridepublic void repeatAction() {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));}}, 50);//连续加buttonAdd.setLongClickRepeatListener(new LongClickButton.LongClickRepeatListener() {@Overridepublic void repeatAction() {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) + 1));}}, 50);//减1buttonSub.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {numberTV.setText(String.valueOf(Integer.parseInt(numberTV.getText().toString()) - 1));}});//加1buttonAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic boolean onLongClick(View v) {new Thread(new LongClickThread()).start();return true;}});}/** * 长按时,该线程将会启动 */private class LongClickThread implements Runnable {private int num;@Overridepublic 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);}@Overridepublic 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程序设计有所帮助。