stop watch logica

Ik wil het ontwikkelen van een eenvoudige stopwatch logica in android.

Op te klikken een lijst weergeven van de timer moet starten en op de knop de timer te stoppen. Kan iemand alsjeblieft help mij. Voorbeeldcode zal een grote hulp zijn

 

5 Replies
  1. 41

    Gebruik de Stopwatch Klasse (Voor een hogere precisie gebruik System.nanoTime())

    Het toevoegen van een Start – ( – ) evenement en Stop() event op een Knop wordt gedrukt. Je moet het bijwerken van de UI dus gebruik een Draad/Handler Combinatie.

    Dit moet u aan de slag.

    EDIT: Toegevoegd Code. (Leuke Oefening! 🙂 )

    Gebruik de Refresh_Rate om te configureren hoe vaak de UI is bijgewerkt.

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class Main extends Activity implements OnClickListener{
    
        final int MSG_START_TIMER = 0;
        final int MSG_STOP_TIMER = 1;
        final int MSG_UPDATE_TIMER = 2;
    
        Stopwatch timer = new Stopwatch();
        final int REFRESH_RATE = 100;
    
        Handler mHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                case MSG_START_TIMER:
                    timer.start(); //start timer
                    mHandler.sendEmptyMessage(MSG_UPDATE_TIMER);
                    break;
    
                case MSG_UPDATE_TIMER:
                    tvTextView.setText(""+ timer.getElapsedTime());
                    mHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIMER,REFRESH_RATE); //text view is updated every second, 
                    break;                                  //though the timer is still running
                case MSG_STOP_TIMER:
                    mHandler.removeMessages(MSG_UPDATE_TIMER); //no more updates.
                    timer.stop();//stop timer
                    tvTextView.setText(""+ timer.getElapsedTime());
                    break;
    
                default:
                    break;
                }
            }
        };
    
        TextView tvTextView;
        Button btnStart,btnStop;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tvTextView = (TextView)findViewById(R.id.TextView01);
    
            btnStart = (Button)findViewById(R.id.Button01);
            btnStop= (Button)findViewById(R.id.Button02);
            btnStart.setOnClickListener(this);
            btnStop.setOnClickListener(this);
    
        }
    
        public void onClick(View v) {
            if(btnStart == v)
            {
                mHandler.sendEmptyMessage(MSG_START_TIMER);
            }else
            if(btnStop == v){
                mHandler.sendEmptyMessage(MSG_STOP_TIMER);
            }
        }
    }
    • Sorry om verder te gaan met de vraag…Eigenlijk ben ik vast aan het bijwerken van de UI bij android. Ik heb deze klasse in java. Maar, hoe kan ik zeggen dat een label met het tonen van de tijd…???
    • Ik heb een eenvoudige lay-out. Een label en twee knoppen. Op te klikken start een timer moet starten en op te klikken stoppen van de timer moet stoppen… Dat is alles. Niets complex. Hoeft alleen maar het uitvoeren van de timer en het bijwerken van het label met de tijd…
    • Natuurlijk is er de standaard Chronometer klasse: developer.android.com/reference/android/widget/Chronometer.html
    • uw stopwatch link is dood
    • Sorry, Het is alweer 5 jaar. Zie de implementatie in Bilal Rabbani ‘ s antwoord.
    • Voor het bijwerken van de tekst op textview elke 1 seconde, niet wij moeten de tijd in milliseconden? als we moeten, dan refresh_rate zou 1000, niet 100. Heb ik gelijk?
    • want het is niet gegarandeerd dat het bericht wordt doorgegeven aan de precieze vertraging is het ideaal om een lagere refresh rate zodat je niet zien voor een tijd “overslaan” in de tekst weergeven soms.
    • Bedankt man voor het opruimen van mijn twijfel.Waardeer uw hulp.
    • Ik heb nog twijfel over refresh_rate. Als u gesuggereerd als we lager refresh_rate “om te voorkomen dat tijd overslaan situatie”, onze update zal gebeuren op UI elke 100 ms in plaats van 1 sec? Ik bedoel UI zal de update sneller dan de werkelijke tijd, is het niet?
    • De Tijd van de StopWatch . Als de updates gebeuren 10 keer in 1 sec, het is nog steeds het tonen van de tijd voor de tweede 10 keer. (uiteraard overbodig).

  2. 16

    Als st0le gaf een uitstekend voorbeeld door het gebruik van Stopwatch klasse. Ik gewijzigde deze klasse een beetje en voeg een paar methoden aan.

    /*
    Copyright (c) 2005, Corey Goldberg
    
    StopWatch.java is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    
    Modified: Bilal Rabbani [email protected] (Nov 2013)
    */
    
    package bilalrabbani1.at.live.com;
    
    public class Stopwatch {
    private long startTime = 0;
    private boolean running = false;
    private long currentTime = 0;
    
    public void start() {
        this.startTime = System.currentTimeMillis();
        this.running = true;
    }
    
    public void stop() {
        this.running = false;
    }
    
    public void pause() {
        this.running = false;
        currentTime = System.currentTimeMillis() - startTime;
    }
    public void resume() {
        this.running = true;
        this.startTime = System.currentTimeMillis() - currentTime;
    }
    
    //elaspsed time in milliseconds
    public long getElapsedTimeMili() {
        long elapsed = 0;
        if (running) {
             elapsed =((System.currentTimeMillis() - startTime)/100) % 1000 ;
        }
        return elapsed;
    }
    
    //elaspsed time in seconds
    public long getElapsedTimeSecs() {
        long elapsed = 0;
        if (running) {
            elapsed = ((System.currentTimeMillis() - startTime) / 1000) % 60;
        }
        return elapsed;
    }
    
      //elaspsed time in minutes
    public long getElapsedTimeMin() {
        long elapsed = 0;
        if (running) {
            elapsed = (((System.currentTimeMillis() - startTime) / 1000) / 60 ) % 60;
        }
        return elapsed;
    }
    
    //elaspsed time in hours
    public long getElapsedTimeHour() {
        long elapsed = 0;
        if (running) {
            elapsed = ((((System.currentTimeMillis() - startTime) / 1000) / 60 ) / 60);
        }
        return elapsed;
    }
    
    public String toString() {
        return getElapsedTimeHour() + ":" + getElapsedTimeMin() + ":"
                + getElapsedTimeSecs() + "." + getElapsedTimeMili();
    }
    }

    Betreft

  3. 1

    In plaats van het gebruik van de lijst die u gewoon gebruik maken van een tekst weergeven voor timer en 3 knoppen voor start stop en reset . Via deze kunt u de java-code dienovereenkomstig

  4. 0

    IntentService gebaseerd, geen niet-SDK afhankelijkheden en op een enkel bestand:

    import android.app.Activity;
    import android.app.IntentService;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v4.content.LocalBroadcastManager;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class Main extends Activity {
        static final String BROADCAST_ACTION = "com.cirosantilli.android_cheat.intent_service_text_view.BROADCAST";
        static final String EXTENDED_DATA_STATUS = "com.cirosantilli.android_cheat.intent_service_text_view.BROADCAST";
        static final String TAG = "com.cirosantilli";
    
        private int i = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.d(TAG, "onCreate");
            super.onCreate(savedInstanceState);
            final LinearLayout linearLayout = new LinearLayout(this);
            Button button;
            final Intent intent = new Intent(Main.this, MyService.class);
    
            button = new Button(this);
            button.setText("start service");
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d(TAG, "start button");
                    Main.this.startService(intent.putExtra(Main.EXTENDED_DATA_STATUS, Main.this.i));
                }
            });
            linearLayout.addView(button);
    
            button = new Button(this);
            button.setText("stop service");
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d(TAG, "stop button");
                    Main.this.stopService(intent);
                }
            });
            linearLayout.addView(button);
    
            final TextView textView = new TextView(this);
            textView.setText(Integer.toString(i));
            linearLayout.addView(textView);
            this.setContentView(linearLayout);
    
            LocalBroadcastManager.getInstance(this).registerReceiver(
                    new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            Main.this.i = intent.getIntExtra(Main.EXTENDED_DATA_STATUS, 0);
                            textView.setText(Integer.toString(Main.this.i));
                        }
                    }, new IntentFilter(Main.BROADCAST_ACTION)
            );
        }
    
        public static class MyService extends IntentService {
            private Handler mHandler;
            private int i = 1;
            private boolean done;
            public MyService() {
                super("MyService");
            }
            @Override
            protected void onHandleIntent(Intent intent) {
                Log.d(TAG, "onHandleIntent");
                this.i = intent.getIntExtra(Main.EXTENDED_DATA_STATUS, 0);
                this.done = false;
                while(!done) {
                    Log.d(TAG, "while true");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                    LocalBroadcastManager.getInstance(this).sendBroadcast(
                            new Intent(Main.BROADCAST_ACTION)
                            .putExtra(Main.EXTENDED_DATA_STATUS, MyService.this.i));
                    this.i++;
                }
            }
            @Override
            public void onDestroy() {
                Log.d(TAG, "onDestroy");
                this.done = true;
                super.onDestroy();
            }
        }
    }

    Voor lage precisie alleen. We konden krijgen meer precisie met behulp van System.currentTimeMillis binnen onHandleIntent in plaats van met de waarde van het gehele getal, en het verminderen van de slaap tijd om latency te verminderen.

    Getest op Android 22. Standaard bouwen bewaarplaats hier.

  5. -1

    Goede voorbeeld, slechts in het geval als iemand wil dat de lay-bestand om te gaan met deze (vrij eenvoudig maar).

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <EditText
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="49dp"
        android:ems="10" >
    
        <requestFocus />
    </EditText>
    
    <Button
        android:id="@+id/Button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/TextView01"
        android:layout_marginTop="42dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="Start" />
    
    <Button
        android:id="@+id/Button02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/Button01"
        android:layout_marginTop="14dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="Stop" />

    stop watch logica

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *