1

我编写了一个线程表面视图。它有效,但似乎不能很好地刷新。我的意思是不能很好地刷新是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;
}

屏幕类代码:

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 类方法,但它做同样的事情。我是否缺少一些行来清除屏幕?

4

1 回答 1

1

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

为此,您必须重新绘制 Canvas 的全部内容,而不仅仅是已更改的部分。看起来您只是在绘制移动的正方形,而没有绘制背景来填充 Canvas 的其余部分。

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

于 2013-05-03T06:24:57.580 回答