我编写了一个线程表面视图。它工作但似乎没有很好的刷新。我不是刷新的意思是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类方法,但它做了同样的事情。我错过了一些线来清除屏幕吗?
答案 0 :(得分:1)
由于您没有为lockCanvas()提供脏矩形,因此系统无法保证在unlockCanvasAndPost(Canvas)和下次调用lockCanvas()之间Canvas会发生什么。
因此,您必须重绘Canvas的整个内容,而不仅仅是已更改的部分。看起来你只是在绘制正在移动的方块,而没有绘制背景来填充画布的其余部分。
注意:如果使用lockCanvas(Rect dirty),情况会有所不同。