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);

この部分は通常の状況では正常に機能しています。ただし、このサービスに対応する設定で設定が変更されるたびにこのコードを実行するリスナーがあります。設定アクティビティからこのコードを実行するたびにNullPointerc.save()メソッドを取得しているようです。

壁紙がフォアグラウンドにない場合にのみ、holder.lockCanvas()のようです。フォアグラウンドにないときにこのサーフェスに描画することは不可能ですか?

4

2 に答える 2

2

それは正しい。これを回避する一般的な方法は、onPauseまたはonVisibilityChanged(false)でリスナーの登録を解除し、onResumeまたはonVisibilityChanged(true)で再登録することです。これは、キャンバスが表示されていないときに設定の変更に反応するべきではないためです。

別の解決策は、コードのそのセクションをnullチェックで囲み、それを忘れることです。ただし、これはお勧めしません。実際に実行したいのは、コードが表示されていないときにコードが表面に描画されないようにすることです。

于 2011-08-05T15:42:24.947 に答える
1

この質問は古くからあると思いますが、同じ質問をして、自分に合った別の答えを見つけたので、後世のために共有したいと思いました。

サーフェスからキャンバスを取得する前に、SurfaceHolder.getSurface.isValid()を確認してください。nullキャンバスの問題を修正しました。

于 2020-09-15T16:17:30.760 に答える