Создать инкрементный таймер в секундах в формате 00:00? - PullRequest
9 голосов
/ 29 марта 2010

Я хочу создать инкрементный второй таймер, как секундомер.

Итак, я хочу, чтобы можно было отображать приращения секунд и минут в формате 00:01 ...

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

Edit:

Вот что у меня есть в хронометре в Android до сих пор

InCreate ()

    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);
            }
     });

В онДестрой ()

@Override
public void onDestroy() {

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

    super.onDestroy();
}

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

Ответы [ 2 ]

29 голосов
/ 29 марта 2010

Я предполагаю, что вы не знаете об Android 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, который вы, вероятно, хотите. Исправить это несложно, но я оставлю это на ваше усмотрение! :)

2 голосов
/ 29 марта 2010

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

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

Вы можете взглянуть на Апплет секундомера и изменить при необходимости (К сожалению, нет источника с этим)

...