簡體   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