设置背景计时器以随机更改颜色

时间:2017-07-26 08:29:06

标签: android

我有一个视图,我需要每隔X秒更改一次颜色。

我想决定何时可以启动和停止计时器。

必须在后台完成此操作才能阻止UI线程。

6 个答案:

答案 0 :(得分:2)

@BaptisteM,而不是使用AsyncTask,你可以像这样使用Handler和Runnable,

{{1}}

答案 1 :(得分:1)

试试这个你可以使用TimerTask: - >可以通过计时器安排一次或重复执行的任务。

TimerTask

Timer timer;
timer = new Timer();
timer.scheduleAtFixedRate(new RemindTask(), 0, 3000); // delay*/

private class RemindTask extends TimerTask 
{
 int current = viewPager.getCurrentItem();
 @Override
 public void run() {
    runOnUiThread(new Runnable() {
        public void run() {
            coloredTextView.setTextColor(getRanColor());
        }
    });

    }

}

答案 2 :(得分:0)

有人提出这个问题,我开始回答这个问题,但主持人关闭了它,所以我把我的例子放在这里。

此示例每1000ms随机更改一次TextView的颜色。 间隔可以改变。

package com.your.package;

import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    TextView coloredTextView;
    long interval = 1000; //in ms
    boolean timerOn = false;

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

        coloredTextView = (TextView) findViewById(R.id.colorTextView);
        startColorTimer();
    }

    private void startColorTimer(){
        new ColorTimer().execute();
        timerOn=true;
    }

    private void stopColorTimer(){
        timerOn=false;
    }

    private class ColorTimer extends AsyncTask<Void, Void, Void> {

        public ColorTimer() {
            timerOn=true;
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(interval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            coloredTextView.setTextColor(getRanColor());
            if(timerOn) new ColorTimer().execute();
        }


        private int getRanColor() {
            Random rand = new Random();
            return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
        }

        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            timerOn=false;
        }
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="fr.rifft.bacasable.MainActivity">

    <TextView
        android:id="@+id/colorTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:text="Colored Text View"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

我希望它可以提供帮助。

答案 3 :(得分:0)

您可以使用Handler类: https://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,长)

postHandler()计算背景上的时间,并在事件发生时将事件发送到主线程。

此外,您可以使用并发: https://en.wikipedia.org/wiki/Recursion_(computer_science)

final int[] colors = new int[]{
        0xFF0000FF,
        0xFF00FF00,
        0xFFFF0000,
        0xFFFF00FF,
};
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        findViewById(R.id.bg_to_change).setBackgroundColor(colors[new Random().nextInt(colors.length)]);
        handler.postDelayed(this, 500);
    }
}, /*This is your X*/ 500);

答案 4 :(得分:0)

您可以使用TimerTask来执行此操作。

从onResume()

启动计时器
@Override
    public void onResume() {
        super.onResume();
        startColor();
    }

并从onStop()

停止计时器
@Override
    public void onStop() {
        super.onStop();
        if (timer != null)
            timer.cancel();
        if (task != null)
            task.cancel();
    }

并将以下代码添加到您的活动中。

TimerTask task;
    Timer timer;

    private void startColor() {
        task = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        coloredTextView.setBackgroundColor(getRanColor());
                    }
                });

            }

            private int getRanColor() {
                Random rand = new Random();
                return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
            }
        };
        timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, 1000);
    }

答案 5 :(得分:0)

你可以这样做:

Handler mHandler = new Handler();

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {         
    @Override
    public void run() {
        mHandler.post(new Runnable() {                  
            @Override
            public void run() {
                //change color
            }
        });
    }
}, 0, 5* 1000); // 5s

通过以下方式阻止它:

timer.cancel();