调用 invalidate() 时计时器在 Android 中不起作用
Posted
技术标签:
【中文标题】调用 invalidate() 时计时器在 Android 中不起作用【英文标题】:Timer not working in Android when calling invalidate() 【发布时间】:2016-08-10 19:47:50 【问题描述】:我想通过用灰色、白色(与背景匹配)然后再次灰色绘制路径来创建闪烁效果。我想闪3次,显示灰1秒,白1秒灰1秒,等等。
当我为postDelayed()
创建了Handler
时,程序跳过了run(),并没有在时序集中执行,也没有出现闪退:
final Handler handler = new Handler();
handler.postDelayed(new Runnable()
@Override
public void run()
invalidate(); //calls onDraw()
Log.d(TAG, "Flashing now now");
, 1000);
如何用计时器实现这样的闪烁功能并闪烁 3 次?
谢谢!
【问题讨论】:
为什么不试试 timertask 呢? 我该怎么做?可以举个例子吗? 【参考方案1】:你可以试试这样的,
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 等。如果您仍然需要帮助,请告诉我。
【讨论】:
【参考方案2】:这是一个工作代码示例,展示了我们如何将地球仪从蓝色变为红色并再次闪烁。你可以修改里面的代码来限制你想要的次数和时间延迟。
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);
【讨论】:
嗨,Kristy,您正在使用两个不同的图像制作动画。那不是很好的编程习惯。理想情况下,您可能希望设置一个 .png 文件并通过可能使用setIndent()
以编程方式更改颜色。
@Eddev 你能告诉我你所说的“糟糕的编程”是什么意思吗?此外,图像是照片,我无法想象以编程方式改变颜色。以上是关于调用 invalidate() 时计时器在 Android 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章