Android 区分Button单击和长按事件。


在Android开发中,我们经常会遇到这样一个问题:一个Button去控制一个TextView中的数值的变化,当单击Button时,数值加一;当长按Button时,数值持续增加。这篇文章就是解决这样的问题。


简单说一下思路。
1. 使用Button的OnTouchListener接口,当Button被点击的时候(ACTION_DOWN),记录Button被点击时的时间downTime。然后开启while循环,每循环一次,记录一次当前时间thisTime。
2. 判断thisTime-downTime的差值,比如需要长按500毫秒执行长按方法,那么当差值>=500的时候,执行需要的长按方法。
3. 当手指从Button抬起的时候,如果thisTime-downTime差值小于500毫秒的,则认为执行单击操作。
4. 最后使用Handler更新TextView中的值。


long downTime = 0;//Button被按下时的时间
long thisTime = 0;//while每次循环时的时间
boolean onBtnTouch = false;//Button是否被按下
int tvValue = 0;//TextView中的值

button.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            tvValue = Integer.parseInt(textView.getText().toString());
            downTime = System.currentTimeMillis();
            onBtnTouch = true;
            Thread t= new Thread() {
                @Override
                public void run() {
                    while (onBtnTouch) {
                        thisTime = System.currentTimeMillis();
                        if (thisTime - downTime >= 500) {
                            tvValue++;
                            Message msg = handler.obtainMessage();
                            msg.arg1 = tvValue;
                            handler.sendMessage(msg);
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            };
            t.start();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            onBtnTouch = false;
            if (thisTime - downTime < 500) {
                tvValue++;
                Message msg = handler.obtainMessage();
                msg.arg1 = tvValue;
                handler.sendMessage(msg);
            }
        } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
            onBtnTouch = false;
        }
        return false;
    }
});

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        textView.setText(String.valueOf(msg.arg1));
    }
};

以上就是整个实现的思路和代码,希望对你有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值