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

时间:2011-08-05 01:42:53

标签: android live-wallpaper android-canvas surfaceholder

我目前正在使用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);

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

似乎只有当Wallpaper不在前台时,才能持有holder.lockCanvas()。当它不在前景时,是否无法绘制到这个表面?

2 个答案:

答案 0 :(得分:2)

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

另一个解决方案是用空检查简单地包围该部分代码,并忘记它。不过,我建议不要这样做,因为你真正想做的就是防止你的代码在不在视野中时试图绘制到表面。

答案 1 :(得分:1)

我意识到这个问题很古老,但是遇到了同样的问题并且找到了对我有用的不同答案,我想我应该为后人分享。

从表面获取画布之前,请检查SurfaceHolder.getSurface.isValid()是否存在。修复了我的空画布问题。