Android SurfaceView的问题。 我想在SurfaceView中画一个Circle,但是在SimpleDraw方法中canvas为null。为什么? 否 1, Canvas 为空。 否2,SimpleDraw方法在ClickListener中运行,是对的,canvas不为null,为什么?
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);
}
}
2.public class SurfaceTestActivity extends Activity {
Button simpleButton;
SurfaceView sfv;
SurfaceHolder sfh;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
simpleButton=(Button)findViewById(R.id.simple);
sfv=(SurfaceView)findViewById(R.id.surface);
sfh=sfv.getHolder();
simpleButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//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);
}
}
最佳答案
区别在于时间。
没有。 1 尝试在创建 Canvas 之前绘制 Canvas ,但失败。对 sfh.lockCanvas(...)
的调用失败并返回 null
,而不是 Canvas
。
没有。 2 创建 Canvas 后尝试绘制,因此可以正常工作。
这样做:
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(this);
在创建 Canvas 后,使用新的 SimpleDraw
添加 3 个 @Override
方法。
关于java - 使用 SurfaceView 时锁定 Canvas 失败且 Canvas 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9510792/