2014-10-28 2 views
0

Я создаю приложение для камеры, такое как виноград, где вы записываете видео, пока вы держите палец на экране.Защита от непрерывных событий касания

Моя проблема: если кто-то быстро и непрерывно нажимает на экран, логика камеры получает слишком много событий. Он постоянно пытается записать файлы, закрыть рекордер, открыть новое соединение и так далее.

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

Я попытался установить флаг, который предотвращает доступ к камере, когда он все еще занят работой над предыдущей операцией. Это уродливо, но оно работает. Основная проблема заключается в том, что события движения, похоже, подсказывают и увольняются друг за друга, вызывая слишком много событий.

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

Есть ли способ отключить кадровые движения в течение времени, когда камера обрабатывает его подготовку и выпуск?

+0

пытались ли вы давая 500 мс до 1000 мс таймера после нажатия кнопки, как у кого-то это просто нажать так would'nt начать запись и на 'ACTION_UP' можно сбросить таймер – BackStabber

+0

После первого события «MotionEvent.ACTION_DOWN» все последующие события касания (пользователь держит палец на экране) будут событиями «MotionEvent.ACTION_MOVE», пока пользователь не вытащит свой палец на экране, который будет регистрироваться как " MotionEvent.ACTION_UP '. Итак, проверьте, является ли «MotionEvent.ACTION_MOVE» начальным и начинается запись. –

+0

Уродливый, но это может быть вариант. Кажется, что многие вещи вокруг камеры работают только с уродливыми обходными решениями, такими как таймеры и неправильное использование try {} catch {}: -/ – j7nn7k

ответ

1

Попробуйте:

//Class Variable 
Timer timer; 

public boolean onTouch(View view, MotionEvent event) { 
     // Check event type 

     switch (event.getAction()) { 

     // Finger down 
     case MotionEvent.ACTION_DOWN: 
       timer = new Timer(); 
       timer.schedule(recordingfunc(),1000); 
       break; 
     case MotionEvent.ACTION_UP: 
      if(timer!=null){ 
        timer.cancel(); 
} 
         break; 
    } 
}