每秒更改一次颜色 Android Studio
Change Color everysecond AndroidStudio
大家好,首先我是 android 的新人 studio.i 我正在尝试制作倒数计时器,我让它工作了
然后我想在每一刻、每一秒更改背景颜色。
谢谢!
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
getWindow().getDecorView().setBackgroundColor(Color.WHITE);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
getWindow().getDecorView().setBackgroundColor(Color.RED);
}
@Override
public void onFinish() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
}.start();
问题在于,在 onTick
内,您将每个刻度线的背景颜色设置为白色,然后立即设置为红色。这很可能会导致用户看不到白色,因为它会在每次勾选时立即被覆盖。您需要一种方法来为每个刻度更改为单一颜色。
不要忘记在 UI 线程上始终 运行 UI 相关代码。您可以阅读有关如何操作的更多信息 here。
如果您想在每个滴答声中交替使用白色和红色,那么您可以在 CountDownTimer
中设置一个标志,如下所示:
new CountDownTimer(10000, 1000) {
private boolean white = true;
@Override
public void onTick(final long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final int color;
if (white) //Select color depending on flag's value:
color = Color.WHITE;
else
color = Color.RED;
white = !white; //Flip the flag.
getWindow().getDecorView().setBackgroundColor(color);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
}
});
}
@Override
public void onFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
});
}
}.start();
或者更好的是,您可以依赖作为 onTick
的单个参数给出的值 millisUntilFinished
,如下所示:
final long total = 10000, interval = 1000;
new CountDownTimer(total, interval) {
@Override
public void onTick(final long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final long millisElapsed = total - millisUntilFinished;
final int color;
if ((millisElapsed / interval) % 2 == 0)
color = Color.WHITE;
else
color = Color.RED;
getWindow().getDecorView().setBackgroundColor(color);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
}
});
}
@Override
public void onFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
});
}
}.start();
这种方法应该更好,因为如果我从the documentation of CountDownTimer
理解正确的话,millisUntilFinished
(在onTick
中给出)似乎不能保证是区间的倍数,这也取决于 onTick
方法所做的工作量。
大家好,首先我是 android 的新人 studio.i 我正在尝试制作倒数计时器,我让它工作了
然后我想在每一刻、每一秒更改背景颜色。
谢谢!
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
getWindow().getDecorView().setBackgroundColor(Color.WHITE);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
getWindow().getDecorView().setBackgroundColor(Color.RED);
}
@Override
public void onFinish() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
}.start();
问题在于,在 onTick
内,您将每个刻度线的背景颜色设置为白色,然后立即设置为红色。这很可能会导致用户看不到白色,因为它会在每次勾选时立即被覆盖。您需要一种方法来为每个刻度更改为单一颜色。
不要忘记在 UI 线程上始终 运行 UI 相关代码。您可以阅读有关如何操作的更多信息 here。
如果您想在每个滴答声中交替使用白色和红色,那么您可以在 CountDownTimer
中设置一个标志,如下所示:
new CountDownTimer(10000, 1000) {
private boolean white = true;
@Override
public void onTick(final long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final int color;
if (white) //Select color depending on flag's value:
color = Color.WHITE;
else
color = Color.RED;
white = !white; //Flip the flag.
getWindow().getDecorView().setBackgroundColor(color);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
}
});
}
@Override
public void onFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
});
}
}.start();
或者更好的是,您可以依赖作为 onTick
的单个参数给出的值 millisUntilFinished
,如下所示:
final long total = 10000, interval = 1000;
new CountDownTimer(total, interval) {
@Override
public void onTick(final long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final long millisElapsed = total - millisUntilFinished;
final int color;
if ((millisElapsed / interval) % 2 == 0)
color = Color.WHITE;
else
color = Color.RED;
getWindow().getDecorView().setBackgroundColor(color);
String text = String.format(Locale.getDefault(), " %02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
textView.setText(text);
}
});
}
@Override
public void onFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setTextSize(20);
textView.setText("done.");
getWindow().getDecorView().setBackgroundColor(Color.rgb(0, 153, 51));
}
});
}
}.start();
这种方法应该更好,因为如果我从the documentation of CountDownTimer
理解正确的话,millisUntilFinished
(在onTick
中给出)似乎不能保证是区间的倍数,这也取决于 onTick
方法所做的工作量。