Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android/Java中循环使用背景色?_Java_Android_Colors_Animated - Fatal编程技术网

如何在Android/Java中循环使用背景色?

如何在Android/Java中循环使用背景色?,java,android,colors,animated,Java,Android,Colors,Animated,我有一个十六进制颜色列表,每个颜色的持续时间以毫秒为单位。我想在屏幕上填充每种颜色的持续时间,然后转到下一种颜色 我尝试迭代颜色以执行以下操作: myView.setBackgroundColor(Color.parseColor( theColor )); SystemClock.sleep( theDuration ); myView.setBackgroundColor(Color.parseColor( nextColor )); SystemClock.sleep( next

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

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

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

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

 etc...
这对我来说似乎很明显,但在运行时对视图没有任何影响,至少在我的AVD中是这样。我了解到这是因为Android只在预定义的时间绘制。(我也试着调用“Invalidate()”,但运气不好。)

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

(我意识到我也不应该叫sleep(),所以如果有任何建议也将不胜感激。)


谢谢。

有很多方法可以实现你想要的。一种是使用Handler和Runnable。假设您知道如何获取当前颜色和持续时间,您可以执行以下操作:

  • 将Runnable声明为类变量

    private Runnable runnable = null;
    
  • 在onCreate()内部,设置初始视图后,初始化处理程序

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

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

编辑:

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

创建新处理程序时,它被绑定到创建它的线程的线程/消息队列

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

adroid开发者网站上的blogpost使用了与上述提议非常相似的结构

该处理程序将更新代码作为主线程的一部分运行,从而避免了第二个线程的开销,并且便于访问用于用户界面的视图层次结构

看和


将它放入一个方法并调用它。

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

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

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()方法中,他使用Bundle/message对象向处理程序发送一条包含背景颜色的消息:

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

你有没有可能在这个课程/活动中发布更多的代码?查看这是什么方法或者它与什么其他方法交互会很有帮助。我知道Runnable不能在UI线程上运行,所以它们不能修改视图对象。它不需要向UI线程发送一条消息来告诉它更新背景颜色吗?@ScottBowers,请检查更新的答案。我没有投反对票,因为我对Android/Java编程非常陌生,而且还在学习。谢谢你的解释。但是,由于处理程序是UI线程的一部分,它会不会在其持续时间内“锁定”UI,并(可能)导致Android向用户显示警告?正如Android博客帖子所说:“请记住,将这些任务保持小而轻,以避免减慢用户体验。”,而且您只是在更改背景颜色,所以您应该没事。如果您仍然有疑问,请检查链接。(我之前的评论是过早发布的…)我最终在My button click事件处理程序中创建了一个可运行的。一切(通过颜色和持续时间循环加上基于持续时间的“睡眠”)都是在Runnable中完成的。然后,我在UI活动类中创建了一个处理程序,它只改变背景的颜色。Runnable使用Bundle/message对象向处理程序发送包含背景颜色的消息。
public void playOnClick(View v) {
    Runnable runnable = new Runnable() {
        public void run() {
            ...
        }
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));
    }
};
b = new Bundle();
b.putString("color", theColor);
msg = new Message();
msg.setData(b);
handler.sendMessage(msg);