Intereting Posts
Как защитить приложение android от приложений резервного копирования .apk Передача объекта JavaScript с помощью addJavascriptInterface () на Android Почему android: layout_width = "0px" для фрагментов? Определение местоположения пользователя на картах osm Как мне организовать контроль источника для проектов Android, включая библиотеки? Android R.java Синтаксическая ошибка на токене «int», VariableDeclaratorId ожидается после этого токена Как изменить цвет заголовка в пользовательских вкладках Chrome Создание ListView программно Динамическое добавление spinner в DialogFragment Возможно ли получить MAC-адрес клиентских устройств, находящихся в пределах диапазона Wi-Fi? Автоматически регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks? Как я могу получить шаблон формата даты и времени по умолчанию Исследование LeakCanary: com.motorola.pixelpipe.PixelPipeTarget.mContext Как правильно настроить Android Studio (minSdkVersion из) AndroidManifest.xml? Com.android.ddmlib.SyncException: на устройстве в Android нет места

Android SurfaceView onDraw Вопрос

Метод OnDraw моего SurfaceView использует LinkedList путей, определенных TouchEvents на экране. Я хочу добавить функцию отмены, которая удаляет последний узел пути из LinkedList. Когда кнопка нажата, путь удаляется из списка, но SurfaceView не обновляется, пока я снова не удалю кнопку отмены или не коснусь экрана.

Спасибо, Эрик

OnDraw вызывается каждые 60 мс в потоке, но он не обновляет, что меня смущает.

Вы должны использовать:

postInvalidate(); 

не

 invalidate(); 

postInvalidate(); Сообщает основному потоку пользовательского интерфейса, чтобы перерисовать его в следующее удобное время. То, как вы это делаете, не будет работать на отдельном потоке.

Это потому, что Views обновляется только при вызове onDraw (), что происходит из-за активности экрана (например, вы касаетесь его) или когда это программно принудительно это делает.

Вы хотите его принудительно: используйте метод invalidate (), унаследованный от View.

Если удаление происходит внутри вас SurfaceView, просто напишите invalidate () ПОСЛЕ того, как вы закончите удаление. Если это происходит снаружи, то просто сделайте surfaceViewInstance.invalidate ().

Надеюсь это поможет