我想要做的是创建一个带有 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
}
以及 Activity 的 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
返回 null lockCanvas
。
那么我该如何解决这个问题呢?我希望这个绘制方法在活动开始时运行,否则只有在用户开始绘制时才会绘制背景。我尝试了什么:
- 放置- 相同
surface.paint()
的onResume()
结果。 - 覆盖表面
draw(Canvas)
,并在那里绘制 - 没有运气。 - 在绘制之前对 Canvas 进行 nullcheck - 没有例外,但是没有绘制任何内容,就像在 onCreate() 中没有 surface.paint()
我真的不知道为什么会发生这种情况,否则一切似乎都有效。