Подтвердить что ты не робот

Повторное действие андроида при нажатии и удержании кнопки

Я хочу выполнить повторное действие при нажатии и удержании кнопки. Пример. Когда пользователь нажимает кнопку и удерживает ее, он должен повторять аналогичный метод снова и снова с фиксированным интервалом, пока пользователь не удалит палец с кнопки.

4b9b3361

Ответ 1

Существует несколько способов сделать это, но довольно простой - отправить сообщение Runnable на Handler с определенной задержкой. В ней самая основная форма, она будет выглядеть примерно так:

Button button = (Button) findViewById(R.id.button);
button.setOnTouchListener(new View.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, 500);
            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() {
            System.out.println("Performing action...");
            mHandler.postDelayed(this, 500);
        }
    };

});

Идея довольно проста: post a Runnable, содержащий повторяющееся действие на Handler, когда происходит действие "вниз". После этого не отправляйте Runnable еще раз, пока не будет выполнено действие "вверх". Runnable будет размещать себя в Handler (пока действие "вниз" по-прежнему происходит), пока оно не будет удалено действием касания - это то, что позволяет "повторяющийся" аспект.

В зависимости от фактического поведения кнопки и ее onclick/ontouch, за которым вы после этого, вы можете сделать начальную запись без задержки.

Ответ 2

Хотя это не отличная идея. Это можно сделать, запустив таймер на onKeyDown, чтобы стрелять с интервалом, в течение которого вы перемещаете курсор на один шаг и перезапускаете таймер. Затем вы можете отменить таймер на событии onKeyUp. Способ, которым это работает в других системах, состоит в том, чтобы, как правило, перемещаться по первому ключу, а затем немного ждать, чтобы убедиться, что пользователь определенно удерживает кнопку... тогда повторение может быть немного быстрее. Подумайте, что клавиатура автоматически повторяется. Это должно работать и не должно отрицательно влиять на поток ui.

Ответ 3

Вы можете зарегистрировать View.OnKeyListener для этого представления. Пожалуйста, учтите, что лучше отказаться от таких обратных вызовов, иначе - если ваш метод делает что-то даже немного "тяжелое" - пользовательский интерфейс не будет плавным.