首页 文章

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

提问于
浏览
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);

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

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

1 回答

  • 2

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

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

相关问题