我试图每隔5秒画一个红圈。我有一个draw和run方法,run方法调用draw方法绘制圆圈。但是,当从run方法调用draw方法时,表面无效,因此我无法绘制任何内容并且屏幕为黑色。如何使表面有效,或者如果我不能,我怎么能这样做?这是代码和logcat。
public class RandomCircles extends Activity {
MySurfaceView mySurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mySurfaceView = new MySurfaceView(this);
setContentView(mySurfaceView);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mySurfaceView.onResumeMySurfaceView();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mySurfaceView.onPauseMySurfaceView();
}
class MySurfaceView extends SurfaceView implements Runnable {
Thread thread = null;
SurfaceHolder surfaceHolder;
volatile boolean running = false;
Handler handler = new Handler();
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Random random;
public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
surfaceHolder = getHolder();
random = new Random();
}
public void onResumeMySurfaceView() {
running = true;
thread = new Thread(this);
thread.start();
}
public void onPauseMySurfaceView() {
boolean retry = true;
running = false;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void run() {
System.out.println("The run method is running");
// TODO Auto-generated method stub
Draw();
}
public void Draw() {
System.out.println("The draw method is running");
if (surfaceHolder.getSurface().isValid()) {
System.out.println("The surface is valid");
Canvas canvas = surfaceHolder.lockCanvas();
//... actual drawing on canvas
int x = random.nextInt(getWidth());
if (getWidth() - x < 100)
x -= 100;
else if (getWidth() - x > getWidth() - 100)
x += 100;
int y = random.nextInt(getHeight());
if (getHeight() - y < 100)
y -= 100;
else if (getHeight() - x > getHeight() - 100)
y += 100;
int radius;
radius = 100;
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);
// Use Color.parseColor to define HTML colors
paint.setColor(Color.parseColor("#CD5C5C"));
canvas.drawCircle(x, y, radius, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
答案 0 :(得分:3)
实施SurfaceHolder.Callback,仅在收到Surface
回调时在surfaceCreated(SurfaceHolder holder)
呈现。例如:
public MySurfaceView(Context context) {
super(context);
surfaceHolder = getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//stop render thread here
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//start render thread here
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
});
}