16

カウントアップ中にAndroid(できれば1.6以降)のクロノメーターに10分の1秒を表示させる方法を探しています。

これを行うことは可能ですか?そうでない場合、同じことを行う無料の (できればオープンソースの) ライブラリはありますか? 私は自分で書くことに失敗しましたが、他の人のものを使いたいです!

4

7 に答える 7

16

Android のデフォルトのクロノメーター ウィジェットは、ミリ秒の書式設定をサポートしていません。

ミリ秒を表示するためにクロノメーター ウィジェットのソース コードを変更しました。githubからダウンロードします。

于 2012-01-15T00:43:39.353 に答える
5

これを行うことは可能ですか?

あまり。10分の1秒を示すフォーマット文字列を渡すこともできますが、Chronometerそれ自体は1秒ごとにしか更新されません。更新頻度はコードに組み込まれています。

そうでない場合は、同じことを行う無料の(できればオープンソースの)ライブラリがありますか?

ChronometerソースはApacheLicense2.0で利用できるため、必要に応じて変更できます。のすべての出現を検索し、1000それらをに変更し100ます。おそらく、ほとんどの方法でそこにいます。

ChronometerカスタマイズさViewれたクラスはアプリウィジェットフレームワークでサポートされていないため、これはアクティビティで使用できますが、アプリウィジェットでは使用できないことに注意してください。

于 2010-06-05T10:24:05.057 に答える
1

内に構築したクラスのインスタンスを作成しましたActivity。この新しいクラスは、Android クラスの拡張ですCountDownTimer(実装されたメソッドを追加します)。

ここのコンストラクターでは、期間をミリ秒単位で追加し、間隔を 1/10 秒、つまり 100 ミリ秒に追加できます。このonTickメソッドでは、コマンドは指定された期間、1/100 秒ごとに実行されます。それはうまくいくはずです。

于 2012-05-15T22:31:19.040 に答える
0
package ar.com.magiapensada.apps.dayoftheweek;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    public static final int NANOSECONDS_CONVERT = 1000000000;
    public static final int MICROSECONDS_CONVERT = 1000;
    public static final int SEXAGESIMA_CONVERT = 60;
    public static final int SEXAGESIMA_FORMAT_CONVERT = 2;
    public static final String BROADCAST_TIME_UPDATE = "BROADCAST_TIME_UPDATE";
    private Button start;
    private TextView tiempo;
    private long inicio;
    private Long terminado=null;
    private boolean running=false;
    private Button stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.tiempo = (TextView) findViewById(R.id.tiempo);

        this.start = (Button) findViewById(R.id.start);
        this.stop = (Button) findViewById(R.id.stop);

        BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context arg0, Intent intent) {
                String action = intent.getAction();
                if (action.equals(BROADCAST_TIME_UPDATE)) {

                    if ( terminado != null){
                        String cronometro = getCronometroValue(terminado);
                        tiempo.setText(cronometro);
                        terminado=null;
                    }else{
                        String cronometro = getCronometroValue(System.nanoTime());
                        tiempo.setText(cronometro);

                    }
                }


            }
        };
        registerReceiver(broadcastReceiver, new IntentFilter(BROADCAST_TIME_UPDATE));





        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.this.inicio = System.nanoTime();
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        running=true;
                        terminado=null;
                        while(running){
                            sendBroadcast();
                        }

                        sendBroadcast();

                    }
                });
                t.start();
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                terminado = System.nanoTime();
                running=false;

            }
        });

    }

    private void sendBroadcast() {
        Intent intent = new Intent(BROADCAST_TIME_UPDATE);
        MainActivity.this.sendBroadcast(intent);
    }

    private String getCronometroValue(long actual) {
        long dif = actual - MainActivity.this.inicio;

        long segundos = dif/ NANOSECONDS_CONVERT;
        long mili = dif - (segundos*NANOSECONDS_CONVERT);
        mili = mili/ MICROSECONDS_CONVERT;


        long minutos = segundos / SEXAGESIMA_CONVERT;
         segundos = segundos % SEXAGESIMA_CONVERT;

         String segString = formatSexagesima(segundos);
        String minutosString = formatSexagesima(minutos);

        String cronometro =  minutosString + ":" + segString + ":" + mili;
        return cronometro;
    }

    private String formatSexagesima(long value ){
        return String.format("%0" + SEXAGESIMA_FORMAT_CONVERT + "d", value);
    }

}
于 2021-12-14T02:43:21.570 に答える
-1

私はたくさんの研究の後に道を見つけました。エミュレータが約10秒後にクラッシュするというのが真実なので、それが効果的かどうかはわかりませんが、電話では問題なく動作します。これは次のようになります。

import android.os.Handler;
public class Chronometer extends Activity {
  private Handler mHandler = new Handler();
public void actions() {
  mHandler.removeCallbacks(mUpdateTimeTask);
  mHandler.postDelayed(mUpdateTimeTask, 1); //1 is the number of milliseconds you want the text to be updated
}
Runnable mUpdateTimeTask = new Runnable() {
  public void run() {
    i++;
    txt.setText(formatTime(i)); // formatTime is just for make it readable in HH:MM:SS:MS, but I assume you already have this
    mHandler.postDelayed(this, 1);
    }
  };
}
于 2010-08-21T01:22:33.427 に答える