#android #show-hide #control-panel
#Android #показать-скрыть #панель управления
Вопрос:
Я создал пользовательскую панель управления для видеоплеера. Теперь я хочу создать эффект, подобный MediaController по умолчанию, где панель становится видимой при касании экрана и снова становится невидимой после последнего касания. Я могу использовать для этого код такого типа.
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
}
runOnUiThread(new Runnable() {
@Override
public void run() {
// make the panel invisible
}
});
}
};
Я могу запустить поток при касании экрана и сделать его невидимым через 60 секунд. Но в моем случае, если пользователь снова коснется экрана в промежутке между этими 60 секундами, панель должна исчезнуть через 60 секунд после последнего касания. Как также рассмотреть этот случай?
Ответ №1:
Я бы рекомендовал использовать комбинацию Runnable
s и a Handler
. Вы можете выполнять Handler
вызовы, используя postDelayed()
, чтобы сделать что-то, скажем, через 60 секунд.
Вот пример:
private Handler mHandler = new Handler();
mHandler.post(showControls); // Call this to show the controls
private Runnable showControls = new Runnable() {
public void run() {
// Code to show controls
mHandler.removeCallbacks(showControls);
mHandler.postDelayed(hideControls, 60000);
}
};
private Runnable hideControls = new Runnable() {
public void run() {
// Code to hide the controls
}
};
Комментарии:
1. я использовал это:-showControls = new Runnable() { public void run() { // Код для отображения элементов управления mHandler.removeCallbacks(showControls); controlpanel.setVisibility(Просмотр. ВИДИМЫЙ); mHandler.postDelayed(hideControls, 10000); } }; hideControls = new Runnable() { public void run() { // Код для скрытия элементов управления controlpanel.setVisibility(Просмотр. НЕВИДИМЫЙ); } }; // Но он работает в соответствии с первым касанием, кажется, что система не может отменить запуск в очереди. в чем проблема в моем коде?
2. Вы можете отменить запускаемый объект, просто вызвав mHandler.removeCallbacks() для запускаемого объекта.
Ответ №2:
Просто удалите / отмените текущий таймер.
Кстати, вы должны делать это не по потоку, а путем отправки сообщения обработчику. Такая будущая задача таймера не нуждается в другом потоке.