Android 球不显示在带有SurfaceView的页面中。为什么?

Android 球不显示在带有SurfaceView的页面中。为什么?,android,surfaceview,Android,Surfaceview,我想写一个程序,通过SurfaceView在屏幕上移动一个球,并改变drawCircle()方法的X参数,但该程序在屏幕上没有显示任何内容,只显示一个黑色页面 这是我的密码 TestsSurface.java: public class TestSurface extends SurfaceView implements SurfaceHolder.Callback{ SurfaceHolder surfaceHolder; public TestSurface(Context contex

我想写一个程序,通过SurfaceView在屏幕上移动一个球,并改变drawCircle()方法的X参数,但该程序在屏幕上没有显示任何内容,只显示一个黑色页面

这是我的密码

TestsSurface.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);

}
}

我的问题是什么?

在调用
synchronized()
时从未设置变量
surfaceHolder

考虑添加:

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();

谢谢你的快速回复。我添加surfaceHolder=getHolder();但当我运行程序时,程序再次显示黑屏。@你应该尝试在该循环上调用
Thread.Sleep()
,以确保它不会执行得太快。如果它的迭代速度快于您实际看到的速度,并且将x置于比屏幕更大的范围内,它将看起来是黑色的。我在run()方法中的drawing()调用下写入Thread.sleep(1000),但程序运行不正确。我剪切run()方法并粘贴到新类中,新类扩展了线程。现在程序运行正常,但我想知道问题出在哪里?为什么我在TestSurface类中编写run()方法,而程序不运行?Thanks@NiceNICE我想这是因为
Thread-Thread=new-Thread()
实际上并没有告诉代码查看您正在用作线程的当前类。我已经更新了我的答案,以显示如果你不想使用另一个类,你必须如何做。。。