繁体   English   中英

按住按钮时,OnTouchListener()仅执行一次

[英]OnTouchListener() will only execute once while button is pressed and held down

brown = (Button) findViewById(R.id.brownButton);
    brown.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                count++;
                Log.d("count", "" + count);
                return true;
            } else if (event.getAction() == (MotionEvent.ACTION_UP)) {
                count--;
                Log.d("count", "" + count);
                return true;

            }
            return false;

        }
    });

当我的手指按下并按住按钮时,我的计数只会增加一次。 当我放开时,它会相应减少。 请有人告诉我,只要手指按住按钮,我如何才能使代码递增。 谢谢。

我也需要这样做,但这个问题从来没有得到充分的回答,即使它已经相当陈旧了。 但是,可以在这里找到一个好的解决方案: android在按住按钮时重复操作

我正在针对该问题调整该解决方案。 我测试了它,对我有用。

Button brown = (Button) findViewById(R.id.brownButton);
brown.setOnTouchListener(new View.OnTouchListener() {

    private Handler mHandler;
    private int count = 0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (mHandler != null)
                return true;
            mHandler = new Handler();
            mHandler.postDelayed(mAction, 500);
            break;
        case MotionEvent.ACTION_UP:
            if (mHandler == null)
                return true;
            mHandler.removeCallbacks(mAction);
            mHandler = null;
            break;
        }
        return true; // before I had written false
    }

    Runnable mAction = new Runnable() {
        @Override
        public void run() {
            Log.d("count: ", "" + count);
            count++;
            mHandler.postDelayed(this, 500);
        }
    };

});

将来我会将此解决方案应用于自定义软键盘,以便空格键和删除键在按下时继续工作。

更新:今天我终于开始制作连续删除键了。 我以为以前已经测试过上面的代码,但是今天当我在做上面的代码时,我必须从onTouch方法返回true才能使它工作。

触摸侦听器的工作方式如下:

它收到一个ACTION_DOWN事件(用户触摸)

然后,它接收以下所有事件(如果返回true),并将以下所有事件视为ACTION_MOVE事件

触摸修饰器将继续接收ACTION_MOVE事件,直到接收到ACTION_UP或ACTION_CANCEL事件。

因此,仅触发一次ACTION_DOWN,然后触发任意数量的ACTION_MOVE事件,然后触发单个ACTION_UP或ACTION_CANCEL。

如果您希望计数器增加,则需要检查ACTION_MOVE事件。

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
     //do something on DOWN 
         break;
    case MotionEvent.ACTION_MOVE:
         //do something on MOVE
         break;
    case MotionEvent.ACTION_UP:
     //do something on UP           
         break;
    }
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM