如何在Android / Java中循环显示背景颜色?

时间:2014-02-04 22:56:59

标签: java android colors animated

我有一个十六进制颜色列表,每个颜色的持续时间以毫秒为单位。我希望在每个颜色的持续时间内填充屏幕,然后转到下一个颜色。

我尝试迭代颜色以执行以下操作:

 myView.setBackgroundColor(Color.parseColor( theColor ));
 SystemClock.sleep( theDuration );

 myView.setBackgroundColor(Color.parseColor( nextColor ));
 SystemClock.sleep( nextDuration );

 etc...

这对我来说显而易见,但是当它运行时,它对视图没有任何作用,至少在我的AVD中。我知道这是因为Android只在预定义的时间绘制。 (我也尝试过调用“Invalidate()”而没有运气。)

连续显示所有颜色的最佳方法是什么?

(我知道我也不应该叫sleep(),所以对此的任何建议也会受到赞赏。)

感谢。

3 个答案:

答案 0 :(得分:2)

new Thread() {
    @Override
    public void run() {
        YourActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            myView.setBackgroundColor(Color.parseColor( theColor ));
        }
        Thread.sleep( theDuration);

        YourActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            myView.setBackgroundColor(Color.parseColor( nextColor ));
        }
        Thread.sleep( nextDuration );
    }
}.start();

将其放入方法中并调用它。

答案 1 :(得分:0)

有很多方法可以达到你想要的效果。一个可能是使用Handler和Runnable。假设您知道如何获得当前颜色和持续时间,您可以这样做:

  • 将Runnable声明为类变量

    private Runnable runnable = null;
    
  • 在onCreate()中,设置初始视图后,初始化Handler

    final Handler handler = new Handler();
    
  • 初始化runnable并在run()方法中更改背景

    runnable = new Runnable() {
        @Override
        public void run() {
            //change the color
            myView.setBackgroundColor(currentColor);
    
            //run it again in nextDuration miliseconds
            handler.postDelayed(toggle, nextDuration);
        }
    };
    
    //start runnable in theDuration miliseconds
    handler.postDelayed(toggle, theDuration);
    

你可以拥有颜色和持续时间的数组,并使用索引变量循环它们。这假设myView是一个有效的视图。

修改

对于那些投票的人,请阅读Handler的文档:

  

当你创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 ...

换句话说,您正在活动的onCreate()中创建一个处理程序,因此它将能够更新您的视图。

来自adroid-developers网站的

This博客使用与上面提出的非常类似的构造。

  

Handler将更新代码作为主线程的一部分运行,避免了第二个线程的开销,并且还可以轻松访问用于用户界面的View层次结构。

请参阅herehere answered by CommonsWare以及here - answered by Laith Alnagem

答案 2 :(得分:0)

我最终在我的按钮单击事件处理程序中创建了一个Runnable。一切(循环颜色和持续时间加上基于持续时间的“休眠”)在Runnable run()方法中完成。

public void playOnClick(View v) {
    Runnable runnable = new Runnable() {
        public void run() {
            ...
        }

然后我在UI Activity类中创建了一个只改变背景颜色的处理程序。

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Bundle b = msg.getData();
        String theColor = b.getString("color");

        myView = (View) findViewById(R.id.bigView);
        myView.setBackgroundColor(Color.parseColor(theColor));
    }
};

在run()方法中,Runnable使用Bundle / Message对象向包含背景颜色的处理程序发送消息:

b = new Bundle();
b.putString("color", theColor);
msg = new Message();
msg.setData(b);
handler.sendMessage(msg);