Как продолжить обновление экрана без заливки на TouchEvent?(Android SurfaceView) - PullRequest
0 голосов
/ 15 июня 2011

Если у вас есть класс SurfaceView, используемый для анимации / игры / ..., у вас есть метод onTouchEvent () и метод рисования / обновления экрана в том же классе.Теперь я хочу просто спать метод onTouchEvent, чтобы он не вызывался + -80 раз в секунду и не загружал процессор (и, следовательно, вызывал задержку).Проблема в том, что если я сплю этот класс, он также перестает рисовать / обновлять / обновлять.Что может быть хорошим решением для этого?

Edit
@tanner, это действительно то, что я пытаюсь, чтобы onTouchEvent () не вызывался слишком часто.моя попытка:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d("firstTest",Integer.toString(event.getAction()));   //shows up
    if (!sleeper.CurrentlySleeping) {
        Log.d("2ndTest",Integer.toString(event.getAction())); //not showing up
        ~~  some calculations and stuff  ~~

.

public class TouchSleeper extends Thread {
// If Thread is sleeping or not.
public static Boolean CurrentlySleeping;
public TouchSleeper() {
    CurrentlySleeping = false;
    this.setPriority(MIN_PRIORITY);
    }

@Override
public void run() {
    try {
        while (true) {
            CurrentlySleeping = true;
            TouchSleeper.sleep(50);
            CurrentlySleeping = false; }
        ~end~

Сначала фрагмент кода из моего класса SurfaceView.Второй кусок класса / потока, который постоянно меняет логическое значение.Обратите внимание, что мой первый Log.d что-то возвращает, а второй нет.Это говорит мне, что В настоящее время Спящий никогда не ложь?Я до сих пор не разобрался ...?

1 Ответ

1 голос
/ 15 июня 2011

Посмотрите на это:

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP) {
        // Do something here
    }
}

Также посмотрите на MotionEvent javadoc для объяснения различных типов событий.

Byпереопределив onTouchEvent, вы можете контролировать, что происходит в этом методе.Вы можете установить флаг в своей активности (boolean touchEnabled = true) и сделать проверку в onTouchEvent():

if (!touchEnabled) {
    return;
}

// continue with whatever you wanted to do.

// Remove the following line if you don't want to pass the event to the parent.
super.onTouchEvent(event);

ОБНОВЛЕНИЕ

Если ваша проблема заключается просто в том, чтоonTouchEvent() стреляет слишком быстро, тогда вы можете сделать что-то вроде этого:

private long lastTime = -1;

private long threshold = 1000;

@Override
public boolean onTouchEvent(MotionEvent event) {
    long now = System.currentTimeMillis();
    if (lastTime > -1 && (now - lastTime) < threshold) {
        // Return if a touch event was receive less than "threshold" time ago
        return;
    }

    lastTime = now;

    super.onTouchEvent(event);
}
...