按下按钮时运行连续动作

时间:2014-11-27 15:48:34

标签: android runnable

我正在尝试这样做。当我触摸一个按钮并持续按下它时,它必须执行一个动作,这个动作只有在我停止按下它时才会停止。

为此,我得到了这段代码:

btn_gas.setOnTouchListener(new OnTouchListener() {
    private Handler mHandler;
    @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, 10);
                break;
            case MotionEvent.ACTION_UP:
                if (mHandler == null) return true;
                mHandler.removeCallbacks(mAction);
                mHandler = null;
                break;
        }
        return false;
    }
    Runnable mAction = new Runnable() {
        @Override
        public void run() {
            // Do continuous task.
            mHandler.postDelayed(this, 100);
        }
    };
});

但它没有按预期工作,即当我点击按钮时它会连续执行动作,即使没有我连续按下它。为了停止动作,我不得不再次触摸按钮。

如何实现我需要的功能?

2 个答案:

答案 0 :(得分:2)

在onTouch中返回false意味着View对后续事件不感兴趣。这意味着你的onTouch只被调用一次,注册一个ACTION_DOWN事件,启动你想做的任何事情,不再被调用。参考:http://developer.android.com/training/gestures/detector.html

  

小心创建一个为ACTION_DOWN返回false的侦听器   事件。如果这样做,将不会调用侦听器   随后的ACTION_MOVE和ACTION_UP事件串。这是因为   ACTION_DOWN是所有触摸事件的起点。

答案 1 :(得分:1)

您返回truefalse的逻辑是相反的。如果您想获得未来事件,请返回true,在这种情况下为ACTION_UP。事实上,对于一个按钮,你应该安全,总是返回true。此外,您无需继续重新分配Handler

   private Handler mHandler = new Handler ();
    btn_gas.setOnTouchListener(new OnTouchListener() {

    @Override
        public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mHandler.postDelayed(mAction, 10);
                break;
            case MotionEvent.ACTION_UP:
                mHandler.removeCallbacks(mAction);
                break;
        }

        return true;

    }
    Runnable mAction = new Runnable() {
        @Override
        public void run() {
            // Do continuous task.
            mHandler.postDelayed(this, 100);
        }
    };
});`