我有一个十六进制颜色列表,每个颜色的持续时间以毫秒为单位。我希望在每个颜色的持续时间内填充屏幕,然后转到下一个颜色。
我尝试迭代颜色以执行以下操作:
myView.setBackgroundColor(Color.parseColor( theColor ));
SystemClock.sleep( theDuration );
myView.setBackgroundColor(Color.parseColor( nextColor ));
SystemClock.sleep( nextDuration );
etc...
这对我来说显而易见,但是当它运行时,它对视图没有任何作用,至少在我的AVD中。我知道这是因为Android只在预定义的时间绘制。 (我也尝试过调用“Invalidate()”而没有运气。)
连续显示所有颜色的最佳方法是什么?
(我知道我也不应该叫sleep(),所以对此的任何建议也会受到赞赏。)
感谢。
答案 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层次结构。
请参阅here和here 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);