Java 使用SurfaceView时锁定画布失败且画布为空
Android SurfaceView的问题。 我想在SurfaceView中画一个圆,但在SimpleDraw方法中canvas是空的。为什么? 否1,画布为空。 第二,在ClickListener中运行的SimpleDraw方法是正确的,canvas不是null,为什么Java 使用SurfaceView时锁定画布失败且画布为空,java,android,android-canvas,Java,Android,Android Canvas,Android SurfaceView的问题。 我想在SurfaceView中画一个圆,但在SimpleDraw方法中canvas是空的。为什么? 否1,画布为空。 第二,在ClickListener中运行的SimpleDraw方法是正确的,canvas不是null,为什么 1.public class SurfaceTestActivity extends Activity { SurfaceView sfv; SurfaceHolder sfh; /** Called when the a
1.public class SurfaceTestActivity extends Activity {
SurfaceView sfv;
SurfaceHolder sfh;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sfv=(SurfaceView)findViewById(R.id.surface);
sfh=sfv.getHolder();
SimpleDraw();
}
void SimpleDraw(){
Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
getWindowManager().getDefaultDisplay().getHeight()));
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(2);
canvas.drawCircle(150, 150, 80, mPaint);
sfh.unlockCanvasAndPost(canvas);
}
}
}区别在于时间 No.1尝试在画布创建之前绘制画布,但失败。调用
sfh.lockCanvas(…)
失败并返回null
,而不是Canvas
No.2尝试在画布创建后进行绘制,因此它可以正常工作
这样做:
public class SurfaceTestActivity extends Activity implements SurfaceHolder.Callback {
SurfaceView sfv;
SurfaceHolder sfh;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sfv=(SurfaceView)findViewById(R.id.surface);
sfh=sfv.getHolder();
sfh.addCallback(this);
}
void SimpleDraw(){
Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
getWindowManager().getDefaultDisplay().getHeight()));
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(2);
canvas.drawCircle(150, 150, 80, mPaint);
sfh.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// draw AFTER surface created!
simpleDraw();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
变化:
添加SurfaceHolder.Callback
添加sfh.addCallback(此)代码>
创建画布后,使用新的SimpleDraw
添加3个@Override
方法。我被你的问题弄糊涂了,你能澄清一下“2号,SimpleDraw方法在ClickListener中运行,是对的,画布不是空的,为什么?”因为调用SimpleDraw()onClick
方法中的
被注释掉并且不会运行?我是中国人,英语不好。No 2可以运行。No 1和No 2有什么不同。surfaceCreated(…)
将被调用,但这需要sfh.addCallback(这个)代码>
public class SurfaceTestActivity extends Activity implements SurfaceHolder.Callback {
SurfaceView sfv;
SurfaceHolder sfh;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sfv=(SurfaceView)findViewById(R.id.surface);
sfh=sfv.getHolder();
sfh.addCallback(this);
}
void SimpleDraw(){
Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
getWindowManager().getDefaultDisplay().getHeight()));
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(2);
canvas.drawCircle(150, 150, 80, mPaint);
sfh.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// draw AFTER surface created!
simpleDraw();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}