我是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;
}
是否有某种方法可以解决这个问题或迫使更改发生?
提前谢谢。
答案 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,在类中我控制每个动画必须有多长,还有其他方面,比如无限期运行,直到用户在屏幕上中断它为止。非常感谢,我真的很感激帮助。