Как выполнить проверку нажатия клавиш и сопровождение действий пользовательского интерфейса? - PullRequest
1 голос
/ 03 декабря 2010

Что ж, я сделал пользовательский интерфейс Android, и мне нужен мой вид интерфейса для управления этим элементом управления.

а) Пока нажата моя кнопка мыши (нажата кнопка «Вниз» / «Клавиша»), представление должно продолжать что-то делать (например: Клавиша не нажата)

b) Как только я отпущу свою кнопку мыши, на экране должно появиться сообщение (пример: ключ вверх).

Поток образца должен быть примерно таким, когда я нажимаю на представление.

Выход: ( Я нажимаю кнопку мыши на виде и удерживаю ее )

Ключ не работает

Ключ не работает

Ключ не работает

Ключ не работает

Ключ не работает

Ключ не работает

( Теперь я отпускаю кнопку мыши )

Ключ вверх.

Чтобы больше объяснить мою проблему. Я отправляю фрагмент кода, где логика должна идти

@Override

public boolean onTouchEvent(MotionEvent event) {
    Log.d(TAG, event.getAction());
}

Когда я нажимаю кнопку мыши, она печатает «0» (что означает, что мышь нажата), а если я оставляю ее, она печатает в журнале «1», что означает, что мышь работает. Это должно помочь с логикой.

Спасибо за помощь.


Ну, я пробовал что-то вроде

private static int checkValue = 0;

@Override

public boolean onTouchEvent(MotionEvent event) {

    checkValue = event.getAction();

    while (checkValue == 0 ){

    Log.d(TAG, "Pressed");
    checkValue = checkMethod(event.getAction);


}

    private int checkMethod(int test){

    if (checkValue == 0){

      checkValue = 0;
      }

    else checkValue = 1;
}

Ответы [ 4 ]

1 голос
/ 03 декабря 2010

Просто определите OnTouchEventListener ...

private OnTouchListener onTouchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.button) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                //start loop or background task
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                //do something different
            }
        } 
        return true;
    }
} 

... и назначьте его для своей кнопки.

button.setOnTouchListener(onTouchListener);

Когда пользователь касается кнопки, происходит событие ACTION_DOWN.Когда пользователь отпускает кнопку, происходит событие ACTION_UP.Если вы хотите, вы можете запустить цикл в потоке, который может проверять логическую переменную.Я не проверял, если это правильно, но это должно выглядеть так:

private OnTouchListener onTouchListener = new OnTouchListener() {

        private boolean flag = false;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v.getId() == R.id.button) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    flag = true;
                    Thread thread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                            while(flag) {
                                //do something
                            }
                        }
                    });
                    thread.start();
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    flag = false;
                }
            } 
            return true;
        }
    }
1 голос
/ 03 декабря 2010
checkValue = event.getAction();
while (checkValue == 0 ){

Вы никогда не должны использовать магические числа.Используйте константы, определенные API:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

На самом деле ваш код даже не учитывает события перемещения;кажется, предполагается, что если это не событие сбоя, то это повышение ... что совершенно неправильно.

Посмотрите в документации, чтобы увидеть, какие значения действий вы можете ожидать, и сделайте правильную вещьконкретные действия, которые вас интересуют. Например, up:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

1 голос
/ 03 декабря 2010

Возможно, вы могли бы создать и запустить поток, когда происходит касание с полем volatile boolean stop = false, которое проверяет это значение в каждом цикле после некоторого времени ожидания. Когда касание заканчивается, вы можете установить для логической переменной значение false.

Редактировать: добавил пример

private MyHandler h;

public void handleDown() {
  System.out.println("touch began");
  h = new MyHandler();
  h.start();
}

public void handleUp() {
  h.pleaseStop = true;
  System.out.println("touch ended");
}

class MyHandler extends Thread {
  volatile boolean pleaseStop = false;

  public void run() {
    while (!pleaseStop) {
      System.out.println("touch is active...");
      Thread.sleep(500);
    }
  }
}
0 голосов
/ 10 декабря 2010

Создать поток, который инициируется касанием, и иметь логический флаг, чтобы поддерживать его. Когда касание отпущено, установите флаг в значение false, чтобы нить присоединилась (завершается).

Поскольку поток не зависит от основной логики, процесс выполняется быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...