#java #android #android-studio #wear-os
#java #Android #android-studio #wear-os
Вопрос:
Здесь я создал этот метод для запуска моего таймера, а тот, что ниже, обновляет таймер:
private void startTimer()
{
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
progress ;
pb.setProgress((int)progress*100/((int)millisUntilFinished/1000));
}
@Override
public void onFinish()
{
progress ;
pb.setProgress(100);
//Vibration
if (Build.VERSION.SDK_INT >= 26)
{
((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
Toast.makeText(MainActivity2.this,"Done",Toast.LENGTH_SHORT).show();
}
else
{
((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createWaveform(new long[]{150}, new int[]{VibrationEffect.EFFECT_CLICK},-1));
}
}
}.start();
}
private void updateCountDownText()
{
//time in minutes and seconds
int minutes = (int)(mTimeLeftInMillis/1000)/60;
int seconds = (int)(mTimeLeftInMillis/1000)%60;
//formating the above to appear as String
String timeLeftFormatted = String.format("d:d",minutes,seconds);
timer.setText(timeLeftFormatted);
}
«pb» — это имя моей панели прогресса. Он продолжает заканчиваться раньше, чем обратный отсчет на 2 минуты, и я не знаю, как их синхронизировать. Также по завершении вибрация по какой-то причине не запускается, хотя это было раньше. «прогресс» инициализируется как ноль в качестве глобальной переменной.
Ответ №1:
Вот решение:
long millisInFuture;
private void startTimer() {
millisInFuture = mTimeLeftInMillis;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
long millisPassed = millisInFuture - mTimeLeftInMillis;
progress = (int) (millisPassed * 100 / millisInFuture);
pb.setProgress(progress);
}
@Override
public void onFinish() {
pb.setProgress(100);
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
VibrationEffect effect =
VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE);
vibrator.vibrate(effect);
Toast.makeText(MainActivity2.this, "Done", Toast.LENGTH_SHORT).show();
} else {
vibrator.vibrate(150);
}
}
}.start();
}
Комментарии:
1. Я не знаю, работает это или нет, потому что таймер перестал считать индикатор выполнения, хотя он работает
2. @MohamedElKayal Если вы не знаете, попробуйте запустить этот код и сообщите мне результат.
3. Я запустил его, я имел в виду, что после того, как я это сделал, счетчик не обновил только индикатор выполнения. Я попробую запустить его снова, чтобы посмотреть, не пропустил ли я что-нибудь.
4. «счетчик», который вы упомянули в своем комментарии, — это
timer
TextView в вашем коде, не так ли?5. Я думаю, что он работает, просто ожидая его завершения, заранее спасибо, и да, счетчик — это текстовое представление таймера.
Ответ №2:
Но я не вижу, когда вы инициализируете свою панель прогресса. Если вы установите pb.max (или setMax в Java) = 100 и при каждом нажатии вызываете метод :
private changePb(long millisUntilFinished){
pb.progress = (millisUntilFinished / millisStartValue) * 100
}
Где millisStartValue было первым значением, которое вы ввели в new CountDownTimer(mTimeLeftInMillis
И в onFinish вам не нужно вводить новое значение для progressbar.
Комментарии:
1. должен ли я инициализировать панель прогресса как ноль? Это то, что вы имеете в виду?
2. да, просто проверяю, установлен ли индикатор выполнения на максимальное значение = 100 (может быть в вашем макете)
3. max установлен на 100, а прогресс равен нулю, так чего же мне здесь не хватает?