调用 invalidate() 时计时器在 Android 中不工作
Timer not working in Android when calling invalidate()
我想通过绘制一条颜色为灰色、白色(与背景匹配)然后再次变为灰色的路径来创建闪烁效果。我要闪3次,灰1秒,白1秒,灰1秒,等等
当我为postDelayed()
创建一个Handler
时,程序跳过了运行(),并没有按时序执行,也没有出现闪烁:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
invalidate(); //calls onDraw()
Log.d(TAG, "Flashing now now");
}
}, 1000);
如何使用定时器实现这样的闪烁功能并闪烁 3 次?
谢谢!
你可以这样试试,
int delay = 5000; // delay for 5 sec.
int period = 1000; // repeat every sec.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("done}
}, delay, period);
否则,您还有很多其他示例可以参考,例如 Example 1, Example 2, Example 3 等。如果您仍需要帮助,请告诉我。
这是一个工作代码示例,说明我们如何将地球从蓝色闪烁到红色,然后再闪烁。您可以修改里面的代码来限制您想要的次数和延迟时间。
protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this);
@Override
protected onCreate(Bundle bundle) {
handlerFlashGlobe.sendEmptyMessageDelayed(0, 700);
}
/**
* private static handler so there are no leaked activities.
*/
protected static class MyGlobeFlasherHandler extends Handler {
private final WeakReference<HomeBase> activity;
public MyGlobeFlasherHandler(HomeBase activity) {
this.activity = new WeakReference<HomeBase>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (activity.get() != null) {
if (activity.get().shadedGlobe) {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
} else {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
}
activity.get().shadedGlobe = !activity.get().shadedGlobe;
sendEmptyMessageDelayed(0, 700);
}
}
}
我想通过绘制一条颜色为灰色、白色(与背景匹配)然后再次变为灰色的路径来创建闪烁效果。我要闪3次,灰1秒,白1秒,灰1秒,等等
当我为postDelayed()
创建一个Handler
时,程序跳过了运行(),并没有按时序执行,也没有出现闪烁:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
invalidate(); //calls onDraw()
Log.d(TAG, "Flashing now now");
}
}, 1000);
如何使用定时器实现这样的闪烁功能并闪烁 3 次?
谢谢!
你可以这样试试,
int delay = 5000; // delay for 5 sec.
int period = 1000; // repeat every sec.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("done}
}, delay, period);
否则,您还有很多其他示例可以参考,例如 Example 1, Example 2, Example 3 等。如果您仍需要帮助,请告诉我。
这是一个工作代码示例,说明我们如何将地球从蓝色闪烁到红色,然后再闪烁。您可以修改里面的代码来限制您想要的次数和延迟时间。
protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this);
@Override
protected onCreate(Bundle bundle) {
handlerFlashGlobe.sendEmptyMessageDelayed(0, 700);
}
/**
* private static handler so there are no leaked activities.
*/
protected static class MyGlobeFlasherHandler extends Handler {
private final WeakReference<HomeBase> activity;
public MyGlobeFlasherHandler(HomeBase activity) {
this.activity = new WeakReference<HomeBase>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (activity.get() != null) {
if (activity.get().shadedGlobe) {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
} else {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
}
activity.get().shadedGlobe = !activity.get().shadedGlobe;
sendEmptyMessageDelayed(0, 700);
}
}
}