0

私はタイマーの使い方を学んでおり、http://examples.javacodegeeks.com/android/core/os/handler/android-timer-example/の例に従っています。

ユーザーがボタンを押したときにタイマーが開始し、ユーザーの手が離されたときにタイマーが停止するように実装したいので、次のようにコーディングしました。

コード:

button_right.setOnTouchListener( new View.OnTouchListener() 
{
    @Override
    public boolean onTouch(View arg0, MotionEvent event) 
    {
        if(event.getAction()==MotionEvent.ACTION_DOWN )
        {
            startTime = SystemClock.uptimeMillis();
            customHandler.postDelayed(updateTimerThread, 0);



        if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL))
        {
            timeSwapBuff += timeInMilliseconds;
            customHandler.removeCallbacks(updateTimerThread);
        }
        return false;
    }
});  



// setting timer
private Runnable updateTimerThread = new Runnable() 
{
    public void run() 
    {
        timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
        updatedTime = timeSwapBuff + timeInMilliseconds;

        int secs = (int) (updatedTime / 1000);
        int mins = secs / 60;
        secs = secs % 60;
        int milliseconds = (int) (updatedTime % 1000);
        tv_timing.setText("" + mins + ":" + String.format("%02d", secs) + ":" + String.format("%03d", milliseconds));
        customHandler.postDelayed(this, 0);
    }
};      

質問:

すべてが正常に機能し、ユーザーがボタンを押すとタイマーが開始され、保持すると実行され続け、手を離すと停止します。それでも、ユーザーがボタンをもう一度押すと、タイマーは、時間をカウントする前に 0 にリセットするのではなく、前回停止した場所から開始することがわかりました。

このコードを使用する場合、タイマーが 0 にリセットされ、ボタンが再度押されたときにもう一度カウントされるように変更するにはどうすればよいでしょうか? ありがとう!!

4

3 に答える 3

0

コードの詳細を掘り下げ、ウェブでさらに調査したところ、答えが見つかり、コードを次のように変更すると機能しました。

全体として、クロノメーターを紹介してくれたモニカに感謝します。ACTION_DOWNの下でremoveCallbacksを作成するように私を刺激してくれたZyooに感謝します

            if(event.getAction()==MotionEvent.ACTION_DOWN )
            {
                if(startTime == 0L)
                {
                    startTime = SystemClock.uptimeMillis();
                    customHandler.removeCallbacks(updateTimerThread);
                    customHandler.postDelayed(updateTimerThread, 0);
                }

            if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL))
            {
                // timeSwapBuff += timeInMilliseconds; //remove this! 
                customHandler.removeCallbacks(updateTimerThread);
                startTime = 0L;
            }
            return false;


private Runnable updateTimerThread = new Runnable() 
{
    public void run() 
    {
        timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
        //updatedTime = timeSwapBuff + timeInMilliseconds;  //remove this!! else starting from where it stops last time!

        int secs = (int) (timeInMilliseconds / 1000);
        int mins = secs / 60;
        secs = secs % 60;
        int milliseconds = (int) (timeInMilliseconds % 1000);
        tv_timing.setText("" + mins + ":" + String.format("%02d", secs) + ":" + String.format("%03d", milliseconds));
        customHandler.postDelayed(this, 0);
    }
};
于 2013-10-06T17:46:14.127 に答える
0

Androidでクロノメーターを使用してみてください...その機能を使用して、停止、開始、再起動、0に設定できます

于 2013-10-06T17:29:07.677 に答える
0

タイマーがミリ秒を必要としない場合にのみクロノメーターを使用してください。

タイマーをリセットする別のオプションは、次の 1 行を追加することですtimeSwapBuff = 0L;。2 つの別々のものを削除するよりも簡単です。

onClickスタート ボタンのイベントでこの変更を行います。これにより、タイム バッファが 0 にリセットされ、startTime(これも 0) に追加され、タイマーが完全に最初からやり直されます。

試す:

public void onClick(View view) {
    timeSwapBuff = 0L;
    startTime = SystemClock.uptimeMillis();
    customHandler.postDelayed(updateTimerThread, 0);
}
于 2016-04-24T07:31:17.740 に答える