我正在嘗試開發一個使用透明畫布和surfaceView的遊戲,我使用畫布來繪畫並且工作正常。一個畫布,多線程
現在我想補充一點,會在屏幕上移動的物體,例如彈跳球。 我想爲球使用一個新的線程,(因爲否則如果它是SurfaceView的線程,它不會平穩移動)。
所以我很難做到這一點。 您能否請告訴我應該如何以及何時將同一個畫布發送給新球對象,然後將其返回到曲面視圖。
我不知道什麼是最好的方式來處理,這是,我 用球作爲XML佈局視圖試過了,並且它在另一個線程的工作完美,但它沒有任何意義創建1000個視圖時我可以在畫布上繪製它們。
任何見解都會有所幫助!
這是我的代碼:
public class SurfaceMyPaint extends SurfaceView implements Runnable
{
Thread t;
SurfaceHolder holder;
Bitmap brush;
boolean isItOk = false;
public SurfaceMyPaint(Context context)
{
super(context);
holder = getHolder();
initial();
}
public void initial()
{
brush= BitmapFactory.decodeResource(getResources(), R.drawable.brush2);
}
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction()== MotionEvent.ACTION_DOWN)
{
x= event.getX();
y= event.getY();
}
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
x = event.getX();
y= event.getY();
}
return true;
}
public void run()
{
while (isItOk == true)
{
if (!holder.getSurface().isValid())
continue;
myCanvas_w = getWidth();
myCanvas_h = getHeight();
if (result == null)
result = Bitmap.createBitmap(myCanvas_w, myCanvas_h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);
canvas = holder.lockCanvas(null);
c.drawBitmap(brush, x - (brush.getWidth()/2), y - (brush.getWidth()/2), null);
canvas.drawBitmap(result, 0, 0, null);
//我怎樣才能添加此位置:球球=新球(畫布)????
holder.unlockCanvasAndPost(canvas);
}
}
public void pause(){
isItOk = false;
while (true){
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
t=null;
}
public void resume()
{
isItOk = true;
t = new Thread(this);
t.start();
}
}
感謝您的回答。但是,假設我想向Canvas添加1000個落球,但是我看不到其他線程無法工作,因爲我的畫布已經「忙於」畫筆了。而且我已經嘗試過了,球沒有順利移動。我還有什麼其他選擇? – SHAI
我不明白你爲什麼認爲使用額外的線程將解決你的問題。我擔心你決定不瞭解問題的解決方案,特別是:爲什麼球不順暢?單球不能平穩移動嗎?它以何種方式不平滑 - 一致但緩慢的更新,不一致的幀速率,運動方向的變化,閃爍,...?你有沒有分析你的代碼?如果您用簡單的屏幕清晰地替換畫筆位圖副本,問題是否消失? – fadden
是的,我現在正在談論一個單一的球。球的drawBitmap每次(在run-while循環內)都會得到一個不同的Y位置'y = y ++',這樣看起來好像球落下了。通過「不流暢」我的意思是說它不一致,我的意思是它確實下降了,但我認爲一些迭代處理比其他迭代更快,這就是讓球「快速」然後「慢」(沒有太大差別在「快」和「慢」之間)。 – SHAI