9

ストップウォッチのような増分秒タイマーを作成したいと思います。

だから私は00:01の形式で秒と分の増分を表示できるようにしたいです...

グーグルは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のままです。誰かがその理由を理解できますか?

4

2 に答える 2

29

あなたはAndroidを知らないと思いますChronometer-それはすでに基本的なストップウォッチ機能を持っています。その特性に少し取り組む必要がありますが、それがどのように機能するかを理解すれば、それをあなたが望むことを実行させるのは難しくありません。

電話で時間を計算する方法はいくつかありますが、主な2つの方法は次のとおりです。

  1. 私のコンピューターの時計によると、今のような「リアルタイム」はイギリスでは午前11時23分です。ただし、コンピューターがタイムサーバーに接続して時刻が間違っていると言われた場合、またはラップトップを持って旅行していてタイムゾーンの境界を越えた場合は、これが変わる可能性があります。これを使用すると、測定時間がいつでも変わる可能性があるため、ストップウォッチに大混乱をもたらします。

  2. 「起動からの経過時間」。これは、電話の電源がオンになってからのミリ秒数です。この数値は、リアルタイムとは関係ありませんが、完全に予測可能な方法で動作します。これは、Androidクロノメーターが使用するものです。

これChronometerは本質的に「カウントアップ」タイマーであり、現在SystemClock.elapsedRealtime()をそのベース時間に設定された経過Realtime()と比較します。2つを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);

編集:これは基本的なストップウォッチの完全なコードです。これは、XMLファイルで宣言されたクロノメーターウィジェットではなく、TextViewに時間を表示します。

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それを修正するのは難しいことではありませんが、私はあなたが解決するためにそれを残しておきます!:)

于 2010-03-29T10:43:25.210 に答える
2

この1つのデジタル時計はどうですか。

しかし、基本的には、java、stopwatch、digital clockなどのキーワードをグーグルで検索することで、多くのJava実装を見つけることができるはずです...

Stopwatchアプレットを見て、必要に応じて変更することができます(これにはソースがありません)

于 2010-03-29T09:32:32.700 に答える