カウントアップ中にAndroid(できれば1.6以降)のクロノメーターに10分の1秒を表示させる方法を探しています。
これを行うことは可能ですか?そうでない場合、同じことを行う無料の (できればオープンソースの) ライブラリはありますか? 私は自分で書くことに失敗しましたが、他の人のものを使いたいです!
カウントアップ中にAndroid(できれば1.6以降)のクロノメーターに10分の1秒を表示させる方法を探しています。
これを行うことは可能ですか?そうでない場合、同じことを行う無料の (できればオープンソースの) ライブラリはありますか? 私は自分で書くことに失敗しましたが、他の人のものを使いたいです!
Android のデフォルトのクロノメーター ウィジェットは、ミリ秒の書式設定をサポートしていません。
ミリ秒を表示するためにクロノメーター ウィジェットのソース コードを変更しました。githubからダウンロードします。
これを行うことは可能ですか?
あまり。10分の1秒を示すフォーマット文字列を渡すこともできますが、Chronometer
それ自体は1秒ごとにしか更新されません。更新頻度はコードに組み込まれています。
そうでない場合は、同じことを行う無料の(できればオープンソースの)ライブラリがありますか?
Chronometer
ソースはApacheLicense2.0で利用できるため、必要に応じて変更できます。のすべての出現を検索し、1000
それらをに変更し100
ます。おそらく、ほとんどの方法でそこにいます。
Chronometer
カスタマイズさView
れたクラスはアプリウィジェットフレームワークでサポートされていないため、これはアクティビティで使用できますが、アプリウィジェットでは使用できないことに注意してください。
内に構築したクラスのインスタンスを作成しましたActivity
。この新しいクラスは、Android クラスの拡張ですCountDownTimer
(実装されたメソッドを追加します)。
ここのコンストラクターでは、期間をミリ秒単位で追加し、間隔を 1/10 秒、つまり 100 ミリ秒に追加できます。このonTick
メソッドでは、コマンドは指定された期間、1/100 秒ごとに実行されます。それはうまくいくはずです。
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);
}
}
私はたくさんの研究の後に道を見つけました。エミュレータが約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);
}
};
}