在for循环中以编程方式更改颜色不会在屏幕上刷新

时间:2016-03-17 16:16:11

标签: android android-layout

我是Android开发的新手。我目前正在构建一个应用程序,单击按钮时必须闪烁不同的颜色。单击按钮时,我调用一个函数。此功能循环遍历项目列表,并且基本上此时尝试在彼此之后显示蓝色和绿色几次。问题是它只显示最后一种颜色。这只有在线程退出方法时才会发生。在下面的示例中,它是蓝色的。我注意到我做过的一些工作,一旦程序离开当前循环发生的方法,有时甚至更长时间后,屏幕变化就会反映出来。以下是代码:

   //Method that sets the color 

   public void SetVisualLayoutColor(int Color)
    {
        linearLayout.setBackgroundColor(Color);
        linearLayout.invalidate();
        linearLayout.refreshDrawableState();
    }

    //Method that loops and calls above method to set color
   public boolean ShowRepititive()
    {

        boolean successfull = false;

        try
        {
            boolean isGreen =  true;

            //for (TimingItem timingItem : items) {
            for (int i=0;i<=10;i++) {
                if (isGreen) {
                    SetVisualLayoutColor(Color.BLUE);
                    isGreen = false;
                } else
                {
                    SetVisualLayoutColor(Color.BLUE);
                    isGreen = true;
                }

            }

            successfull = true;

        } catch (Exception e)
        {
            Log.e("Repeating Flash", "showFlashRepititive: ", e);
            successfull = false;
        }

        return successfull;
    }

是否有某种方法可以解决这个问题或迫使更改发生?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

除非您在另一个线程上显式运行代码,否则您在Activity,Fragment或View中编写的代码将在UI线程上运行。

当您在UI线程上执行工作时,UI无法更新。 UI仅在代码完成执行后更新。因此,你的for循环阻止任何UI更新,直到它完成,显示你设置的最后一种颜色。

使用更合适的模式是use an animation更改颜色

这是一个非常基本的动画示例,它在两种背景颜色之间进行交叉渐变:

ObjectAnimator.ofObject(view, "backgroundColor", new ArgbEvaluator(), 0xFF0000, 0x00FF00)
    .start();

显然,这不会达到你想要的闪光效果,但你可以用类似的方式定义自己的动画,以达到预期的效果。

答案 1 :(得分:0)

正如Tanis.7x所说,当您的代码在主线程中执行时,您无法创建所需的动画。所有可能的解决方案都必须具有后台线程以及与UI线程进行通信的方式。 (参见AsyncTasks,Threads,Handlers)

ObjectAnimator的替代方案可以在您的特定情况下使用TransitionDrawable。它并不是那么强大,但如果它符合您的需求,那么它更适合,因为它与API 1兼容:

您需要使用转换定义在transitionables文件夹中存储transitioncolors.xml:

<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/green"/>
    <item android:drawable="@color/blue"/>
</transition>

然后致电:

 ImageView view = (ImageView) findViewById(R.id.transitionId);
 view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     TransitionDrawable transition = (TransitionDrawable) v.getBackground();
     transition.startTransition(3000);
 });

其中R.id.transitionId是:

<ImageView
    android:id="@+id/transitionId"
    android:background="@drawable/transitioncolors"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

答案 2 :(得分:0)

在我阅读了Tanis.7x和Sevle的帖子后,我做了一些更多的研究,这使我朝着正确的方向前进。出于某种原因,当我运行它时,对象动画师没有工作,而且Transition没有给我我想要的灵活性。所以我遇到了ValueAnimator,它非常适合我。我创建了自己的类,扩展了ValueAnimator,在类中我控制每个动画必须有多长,还有其他方面,比如无限期运行,直到用户在屏幕上中断它为止。非常感谢,我真的很感激帮助。