我有一个简单的图形应用程序,可以在屏幕上绘制一些内容。以前,我在没有支票的情况下在invalidate()
中拨打onDraw()
时没问题。在我的应用程序中onDraw()
每秒被调用多次(我通过日志来了解),但我不想每秒多次调用它,因为我想在每秒后更新屏幕。所以我试着比较前一秒和当前秒 - 如果它们相同,我就不会叫invalidate()
;如果第二个改变,我会打电话给invalidate()
。这是我的代码:
protected void onDraw(Canvas canvas) {
// Create date to check current second
Date date = new Date();
canvas.drawColor(Color.WHITE);
drawArcs(canvas, mBigOval, mUseCenters[0], mPaints[0]);
//Get the current second
curSec = date.getSeconds();
//compare if its same as lastSec which is updated in drawArcs() which i called before
do {
Log.d("Graphics","curSec="+curSec+" lastSec="+lastSec);
curSec = date.getSeconds();
} while(curSec == lastSec);
Log.d("Graphics","Calling invalidate() and count="+(++count));
invalidate();
}
使用上面的代码,如果我的应用程序在第30秒启动,则日志显示:
06-25 10:25:52.257: D/Graphics(14711): curSec=30 lastSec=30
以上日志不断重复,curSec和lastSec没有变化。为什么第二次没有更新,即使我每次循环都要更新它。
答案 0 :(得分:1)
您的Date
对象已创建并设置为当您使用以下对象进行实例化时的当前时间:
Date date = new Date();
每次拨打date.getSeconds()
时,您只是在同一个Date
对象上获取秒数,其时间没有变化。
那就是说,你真正的问题是你从invalidate()
打来onDraw()
,迫使另一个电话onDraw()
(迫使另一个......)。你不需要这样做;只要View变为无效,就会调用onDraw()
。如果你尝试动画(1 fps?),你可以使用带有postDelayed()
的处理程序或SurfaceView和另一个线程。
答案 1 :(得分:0)
我通过每次创建新对象并立即工作来更改代码。
do{
Log.d("Filling","curSec="+curSec+" lastSec="+lastSec);
curSec = new Date().getSeconds();
}while(curSec == lastSec);