Я предполагаю, что вы не знаете об Android Chronometer — в нем уже есть базовая функция секундомера. Вам нужно немного поработать с его особенностями, но нетрудно заставить его делать то, что вы хотите, когда вы понимаете, как он работает.
Есть несколько способов подсчета времени на телефоне, но два основных:
«Реальное время», например, сейчас, согласно моим компьютерным часам, это 11:23 утра в Англии. Однако это может измениться, если мой компьютер свяжется с сервером времени и получит неправильное время, или если я путешествовал с ноутбуком и пересек границу часового пояса. Использование этого может нанести ущерб вашему секундомеру, поскольку измеренное время может измениться в любое время.
«Время, прошедшее с момента загрузки», которое представляет собой количество миллисекунд с момента включения телефона. Это число не имеет никакого отношения к реальному времени, но оно будет вести себя совершенно предсказуемым образом. Это то, что использует Android Chronometer.
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, а не в виджете Chronometer, объявленном в вашем 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"/>
Несомненно, есть способ заставить Chronometer работать, не объявляя его в файле XML, но конструктор Chronometer stopwatch = new Chronometer(this); не работал должным образом.
Приведенный выше код отображает прошедшее время очень простым способом. Например, если прошло всего 5 секунд, будет показано 0:5, а не 0:05, которое вы, вероятно, хотите. Исправить это несложно, но я оставлю это на ваше усмотрение! :)
person
Steve Haley
schedule
29.03.2010