SurfaceHolder.如果表面不在前景中,lockCanvas返回null



我目前正在Android上做一个LiveWallpaper的测试。我正在画布上绘制一些东西,使用的代码看起来像这样:

final SurfaceHolder holder = getSurfaceHolder();
Canvas c = new Canvas();
c = holder.lockCanvas(); // c becomes null
c.save();
c.drawBitmap(currentBitmap);
c.restore();
holder.unlockCanvasAndPost(c);

该部件在正常情况下工作正常但是,我有一个侦听器,每当与此服务对应的设置中的设置更改时,它就执行此代码。似乎每当我从设置活动中执行此代码时,我都会在c.save()方法上获得NullPointer

似乎只有当墙纸不在前景中时,holder.lockCanvas()。当它不在前景上的时候,就不可能画到这个表面上吗?

没错。避免这种情况的一个常见方法是在onPause或onVisibilityChanged(false)中取消监听器的注册,并在onResume或onVisibilityChanged(true)中重新注册,因为当你的画布不可见时,你不应该对设置更改做出反应。

另一个解决方案是简单地用空检查包围这段代码,然后忘记它。但是,我不建议这样做,因为您真正想做的是防止您的代码甚至试图在它不在视图中时绘制到表面。

我知道这个问题很古老了,但是有了同样的问题,又找到了一个适合我的不同答案,我想我应该和后代分享一下。

检查是否SurfaceHolder.getSurface.isValid()在从表面获取画布之前。

最新更新