每秒更改一次颜色 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 方法所做的工作量。