2013-04-08 55 views
0

我想编写一个程序,通过SurfaceView在屏幕上移动一个球,并更改drawCircle()方法的X参数,但程序不会在屏幕上显示任何内容,只会显示一个黑色页面。球没有在与SurfaceView的页面中显示。为什么?

这是我的代码。

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

} 
} 

什么是我的问题吗?

回答

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

感谢快速回复。我添加surfaceHolder = getHolder();给我的构造函数,但是当我运行程序时,程序再次显示黑屏。 – 2013-04-08 19:11:28

+0

@NiceNICE您应该尝试在该循环中放置一个'Thread.Sleep()'调用,以确保其执行速度不会太快。如果迭代速度比实际看到的要快,并将x放入大于屏幕的范围内,则看起来会变黑。 – Grambot 2013-04-08 20:47:39

+0

我在run()方法中的drawing()调用下面写了Thread.sleep(1000),但程序没有正确运行。我切割run()方法并粘贴到新类中,新类扩展了Thread。现在程序运行正确,但我想知道什么是问题?为什么我在TestSurface类中编写run()方法,程序没有运行?谢谢 – 2013-04-08 21:42:07