【问题标题】:How to cycle through background colors in Android / Java?如何在 Android / Java 中循环使用背景颜色?
【发布时间】:2014-02-04 22:56:58
【问题描述】:

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

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

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

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

 etc...

这对我来说似乎很明显,但在视图运行时不会对视图做任何事情,至少在我的 AVD 中是这样。我了解到这是因为 Android 仅在预定义的时间绘制。 (我也尝试调用“Invalidate()”,但没有成功。)

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

(我意识到我也不应该调用 sleep(),所以对此的任何建议也将不胜感激。)

谢谢。

【问题讨论】:

  • 您是否有机会在此类/活动中发布更多代码?看看这是什么方法或者它正在与什么交互会很有帮助

标签: java android colors animated


【解决方案1】:
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();

把它放在一个方法中并调用它。

【讨论】:

  • (我之前的评论过早地发布了......)我最终在我的按钮单击事件处理程序中创建了一个 Runnable。一切(循环通过颜色和持续时间加上基于持续时间的“睡眠”)都在 Runnable 中完成。然后我在我的 UI Activity 类中创建了一个处理程序,它只是改变了背景的颜色。 Runnable 使用 Bundle/Message 对象向处理程序发送一条包含背景颜色的消息。
【解决方案2】:

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

  • 将 Runnable 声明为类变量

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

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

    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 时,它被绑定到创建它的线程的线程/消息队列中...

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

来自adroid-developers 网站的This blogpost 使用了与上面提出的非常相似的结构。

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

请参阅herehere answered by CommonsWarehere - answered by Laith Alnagem

【讨论】:

  • 我了解到 Runnables 不能在 UI 线程上运行,所以它们不能修改 View 对象。不需要给UI线程发消息告诉它更新背景颜色吗?
  • @ScottBowers,请查看更新后的答案。致反对者 - 解释原因。
  • 我没有投反对票,因为我对 Android/Java 编程还很陌生,而且还在学习。感谢您的解释。但是由于 Handler 是 UI 线程的一部分,它不会在其持续时间内“锁定”UI 并(可能)导致 Android 向用户显示警告吗?
  • 正如 Android 博文所说:“请记住让此类任务小而轻,以免降低用户体验。”而您只是在更改背景颜色,所以应该没问题。如果您仍有疑问,请查看链接。
【解决方案3】:

我最终在我的按钮单击事件处理程序中创建了一个 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);

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多