我正在尝试做的是使用SurfaceView创建绘图应用程序。我的应用基本完成了,但有一件事情遗失了:我无法让SurfaceView在其活动的onCreate中绘制自己。
我的SurfaceView
派生类看起来像这样(只是重要的部分):
class DrawingSurface extends SurfaceView implements OnTouchListener
{
SurfaceHolder holder;
public DrawingSurface(Context context)
{
super(context);
holder = getHolder();
}
// this method does the painting.
public void paint()
{
Canvas canvas = holder.lockCanvas();
//draw a bunch of stuff
holder.unlockCanvasAndPost(canvas);
}
//in the onTouch method i call the paint() without any problem
}
活动的onCreate:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
surface = new DrawingSurface(this);
setContentView(surface);
//surface.paint(); <--- here is the problem
}
因为你可以看到代码非常标准,但是如果我尝试在onCreate()中使用surface.paint(),那么我得到一个NullPointerException
,因为那时SurfaceHolder
1}}为lockCanvas
调用返回null。
那我怎么解决这个问题呢?我希望这个paint方法在Activity的开头运行,因为否则只有当用户开始绘制时才会绘制背景。我尝试了什么:
surface.paint()
放在onResume()
- 相同的结果中。draw(Canvas)
,并在那里画画 - 没有运气。我真的不知道,为什么会这样,否则一切似乎都有效。
答案 0 :(得分:1)
尝试其他型号。在SurfaceView中完成所有绘画
public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback {
public DrawingSurface(Context context) {
super(context);
getHolder().addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
updatePanel();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
updatePanel();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
updatePanel();
}
public void updatePanel() {
Canvas canvas = null;
try {
canvas = getHolder().lockCanvas(null);
synchronized (getHolder()) {
doDraw(canvas);
}
}
finally {
if (canvas != null) {
getHolder().unlockCanvasAndPost(canvas);
}
}
}
}
您还可以在触摸侦听器中调用updatePanel方法。
所有绘画都在doDraw方法中进行,该方法永远不会在SurfaceView外部调用。此外,在尝试绘制任何内容之前,请确保在Canvas对象的doDraw中执行空检查。