0

我有一个简单的图形应用程序,可以在屏幕上绘制一些东西。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 没有变化。为什么即使我每次循环通过时都更新它,第二个也不更新。

4

2 回答 2

1

您的Date对象已创建并设置为您实例化它时的当前时间:

Date date = new Date();

每次调用 时date.getSeconds(),您只是在同一个Date对象上获得秒数,其时间没有改变。

也就是说,您真正的问题是您正在调用invalidate()from onDraw(),强制另一个调用 to onDraw()(这会强制另一个......)。你不需要这样做;onDraw()每当视图变得无效时就已经调用了。如果您尝试制作动画(以 1 fps?),您可以使用带有postDelayed()SurfaceView 和另一个线程的处理程序。

于 2012-06-25T05:14:56.833 回答
0

我通过每次创建新对象及其现在工作来更改代码。

        do{ 
        Log.d("Filling","curSec="+curSec+"  lastSec="+lastSec);
        curSec = new Date().getSeconds();
        }while(curSec == lastSec);
于 2012-06-25T05:20:38.440 回答