0

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

似乎只有当墙纸不在前台时,holder.lockCanvas()。当它不在前景时,是否不可能绘制到这个表面?

4

2 回答 2

2

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

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

于 2011-08-05T15:42:24.947 回答
1

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

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

于 2020-09-15T16:17:30.760 回答