0

我想编写一个程序,通过 SurfaceView 在屏幕上移动球并更改 drawCircle() 方法的 X 参数,但程序在屏幕上不显示任何内容,只显示黑页。

这是我的代码。

测试表面.java:

 public class TestSurface extends SurfaceView implements SurfaceHolder.Callback{
SurfaceHolder surfaceHolder;

public TestSurface(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    getHolder().addCallback(this);
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    Thread thread=new Thread();
    thread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

public void drawing(Canvas canvas){
    drawingShape(canvas);
}
int x=100;
public void drawingShape(Canvas canvas){
    canvas.drawColor(Color.BLACK);
    Paint paint=new Paint();
    paint.setColor(Color.RED);
    canvas.drawCircle(x, 100, 50, paint);
    x+=2;
}

public void run(){
    Canvas canvas;
    while(true){
        canvas=null;
        try{
            synchronized(surfaceHolder){
                canvas=getHolder().lockCanvas();
                drawing(canvas);
            }
        }finally{
            if(canvas!=null)
                getHolder().unlockCanvasAndPost(canvas);
        }
    }
}
 }

MainActivity.java:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    TestSurface test=new TestSurface(this);
    setContentView(test);

}
}

我的问题是什么?

4

1 回答 1

0

您的变量surfaceHolder永远不会在调用时设置synchronized()

考虑添加:

surfaceHolder = getHolder();

...给你的构造函数。

根据以下评论进行编辑::

Thread thread = new Thread(new Runnable() {
  public void run() {
    Canvas canvas;
    while(true){
      canvas=null;
      try{
        synchronized(surfaceHolder){
          canvas=getHolder().lockCanvas();
          drawing(canvas);
        }
      }finally{
        if(canvas!=null)
          getHolder().unlockCanvasAndPost(canvas);
      }
      Thread.Sleep(1000);
    }
  }
}).start();
于 2013-04-08T19:05:05.857 回答