Создать увеличивающийся таймер в секундах в формате 00:00?

StackOverflow https://stackoverflow.com/questions/2536882

Вопрос

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

Поэтому я хочу иметь возможность отображать увеличивающиеся секунды и минуты в формате 00: 01...

Google выдает только 24-часовые примеры, мне было интересно, может ли кто-нибудь помочь мне начать с примера или руководства по тому, что я хочу сделать?

Редактировать:

Вот что у меня есть, используя Хронометр в Android на данный момент

В onCreate()

    secondsT = 0;
    elapsedTimeBeforePause = 0;

    stopWatch.start();
    startTime = SystemClock.elapsedRealtime();
    stopWatch.setBase(elapsedTimeBeforePause);

     stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                //countUp is a long declared earlier
                secondsT = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (secondsT / 60) + ":" + (secondsT % 60); 
                //textGoesHere is a TextView
                ((TextView)findViewById(R.id.time)).setText(asText);
            }
     });

В onDestroy()

@Override
public void onDestroy() {

    inCall = false;
    elapsedTimeBeforePause = SystemClock.elapsedRealtime() - stopWatch.getBase();

    super.onDestroy();
}

Вышеупомянутое компилируется и запускается, но TextView никогда не увеличивается, оно всегда остается равным 0, кто-нибудь может понять, почему?

Это было полезно?

Решение

Я предполагаю, что вы не знаете об Андроиде Chronometer - в нем уже есть базовая функция секундомера.Вам нужно немного поработать с его особенностями, но заставить его делать то, что вы хотите, несложно, как только вы поймете, как это работает.

Существует несколько способов расчета времени по телефону, но двумя основными из них являются:

  1. "Реальное время", например, прямо сейчас, согласно моим компьютерным часам, в Англии 11:23 утра.Однако это может измениться, если мой компьютер свяжется с сервером времени и ему сообщат, что у него неправильное время, или если я путешествовал с ноутбуком и пересек границу часового пояса.Использование этого приведет к сбоям в работе вашего секундомера, поскольку измеренное время может измениться в любой момент.

  2. "Прошедшее время с момента загрузки", которое представляет собой количество миллисекунд с момента включения телефона.Это число не имеет никакого отношения к реальному времени, но оно будет вести себя совершенно предсказуемым образом.Это то, что использует Android-хронометр.

В Chronometer по сути, это таймер "подсчета", сравнивающий текущее SystemClock.elapsedRealtime() против значения elapsedRealtime(), которое было установлено для его базового времени.Разница между ними, деленная на 1000, представляет собой количество секунд, прошедших с момента запуска таймера.Однако, если вы остановите таймер, а затем запустите его снова, вы получите нелогичный результат - таймер будет показывать прошедшее время так, как если бы он никогда не останавливался.Это связано с тем, что вам нужно скорректировать его базовое время, чтобы учесть время, в течение которого оно было остановлено.Это очень просто сделать:

// When you're stopping the stopwatch, use this
// This is the number of milliseconds the timer was running for
elapsedTimeBeforePause = SystemClock.elapsedRealtime() - timer.getBase();

// When you're starting it again:
timer.setBase(SystemClock.elapsedRealtime() - elapsedTimeBeforePause);

Редактировать:Вот полный код для базового секундомера, который отображает ваше время в TextView, а не виджет Хронометра, объявленный в вашем XML-файле.

public class TestProject extends Activity {
    TextView textGoesHere;
    long startTime;
    long countUp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Chronometer stopWatch = (Chronometer) findViewById(R.id.chrono);
        startTime = SystemClock.elapsedRealtime();

        textGoesHere = (TextView) findViewById(R.id.textGoesHere);
        stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                String asText = (countUp / 60) + ":" + (countUp % 60); 
                textGoesHere.setText(asText);
            }
        });
        stopWatch.start();
    }
}

В твоем main.xml тебе нужно иметь это

<Chronometer android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/chrono"
    android:visibility="gone"/>

Несомненно, есть способ заставить Хронометр работать без объявления его в XML-файле, но конструктор Chronometer stopwatch = new Chronometer(this); не сработало должным образом.

Приведенный выше код отображает прошедшее время очень простым способом.Например, если прошло всего 5 секунд, он покажет 0:5 вместо того , чтобы 0:05 ты, наверное, хочешь.Исправить это несложно, но я оставлю это на ваше усмотрение!:)

Другие советы

Как насчет этого Цифровые Часы.

Но в принципе вы должны быть в состоянии найти множество реализаций Java, поискав в Google такие ключевые слова, как java, секундомер, цифровые часы, ...

Вы могли бы взглянуть на Апплет Секундомера и модифицируйте по мере необходимости (Упс, у этого нет источника)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top