OnTouchListener()仅在按下按钮时执行一次

时间:2011-12-01 20:44:55

标签: java android

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;

        }
    });

当我的手指按下并按住按钮时,我的计数只会增加一次。当我放手时它会相应减少。请有人告诉我,只要我的手指按住按钮,我就可以让代码增加。谢谢。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

触控侦听器的工作原理如下:

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

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

触摸lisetener一直接收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;
}

答案 2 :(得分:1)

我也需要这样做,但这个问题从来没有得到充分的回答,即使它已经相当陈旧了。但是,可以在此处找到一个好的解决方案:android repeat action on pressing and holding a button

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

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);
        }
    };

});

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

更新:今天我终于开始制作连续删除密钥了。我之前认为我已经测试了上面的代码,但今天当我这样做时,我必须从true方法返回onTouch才能使其工作。