Android Threaded Surfaceview不刷新

时间:2012-07-19 23:11:52

标签: android multithreading refresh surfaceview

我编写了一个线程表面视图。它工作但似乎没有很好的刷新。我不是刷新的意思是EX:如果我移动位图位置继续绘制在最后位置+是新位置。

这是我的代码:

public GameView(Context context) 
{               
    super(context);
    holder=getHolder(); 
    currentScreen=new TestScreen();
    currentScreen.Load(this.getResources());
}

protected void Resume()
{
    isRunning=true;
    renderThread=new Thread(this);
    renderThread.start();


}


public void run() 
{
    while(isRunning)
    {
        gametime=lasttime-System.nanoTime();
        lasttime=System.nanoTime();
        if(!holder.getSurface().isValid())
            continue;
        if(!(currentScreen==null))
        {
            currentScreen.Update(gametime);
            Canvas cv=holder.lockCanvas();
            currentScreen.Draw(cv, gametime);


            holder.unlockCanvasAndPost(cv);                         
        }

    }
}
public void pause()
{
    isRunning=false;
    while(true)
    {
        try
        {
            renderThread.join();
            }
            catch (InterruptedException e)
            {

            }
        break;
        }
     renderThread=null;
}

}

Screen类代码:

{

public void Load(Resources resources) {
    square=BitmapFactory.decodeResource(resources, R.drawable.square);
    x=y=0;
    super.Load(resources);
}

@Override
public void Update(long gametime) {
    x++;
    super.Update(gametime);
}

@Override
public void Draw(Canvas cv, long gametime) {
    cv.drawBitmap(square, x, y, null);
    super.Draw(cv, gametime);
}

}

我试过没有Screen类方法,但它做了同样的事情。我错过了一些线来清除屏幕吗?

1 个答案:

答案 0 :(得分:1)

由于您没有为lockCanvas()提供脏矩形,因此系统无法保证在unlockCanvasAndPost(Canvas)和下次调用lockCanvas()之间Canvas会发生什么。

因此,您必须重绘Canvas的整个内容,而不仅仅是已更改的部分。看起来你只是在绘制正在移动的方块,而没有绘制背景来填充画布的其余部分。

注意:如果使用lockCanvas(Rect dirty),情况会有所不同。