Android 球不显示在带有SurfaceView的页面中。为什么?
我想写一个程序,通过SurfaceView在屏幕上移动一个球,并改变drawCircle()方法的X参数,但该程序在屏幕上没有显示任何内容,只显示一个黑色页面 这是我的密码 TestsSurface.java: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
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()
实际上并没有告诉代码查看您正在用作线程的当前类。我已经更新了我的答案,以显示如果你不想使用另一个类,你必须如何做。。。