■LiveWallPaperとOpenGLとonSharedPreferenceChangedさて、無事OpenGLをつかってライブ壁紙を作れたわけですが、
1個作ったら俄然欲が出てきて
「壁紙変えてぇ」
「パーティクルの数変更してぇ」
となるわけです。バッテリーのことも考慮して、負担へらせる
設定変更もできたらなと。
お手軽な設定変更方法といえば、SharedPreferencesを使った方法があります。
PreferenceActivityを継承したプリファレンス用のクラスを作成し、
実装するわけですが、ここでハマった点を説明(というか自分用メモ)
・onSharedPreferenceChanged()を実装する場所
まずそこからして分からなかったおバカさんな僕ですが、試行錯誤の末に
ライブ壁紙の場合はエンジンを継承したクラス(参考本の例だとGLengineクラス)
に実装します。
ライブ壁紙に設定画面を追加する↑こちらの内容を100万回ほど参考にしてなんとか実装したのだけれど、困ったことが。
リンク先でも言及されているが、設定変更後は通常drawframe()などで再描画を行い
変更を反映する必要がある。
ところがところが、OpenGLで作った場合そのdrawfameメソッドみたいなのがないのです。
いやあるんだけど、まずは↓を見てみよう。
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
String wall_list = sharedPreferences.getString("list_key","wall001"); //preference.xmlに設定したキーと初期値
if(wall_list.equals("wall002")){ //処理いろいろ。ここではリストから選択して壁紙変更
mWall = R.drawable.wall002;
}else if(wall_list.equals("wall003")){
mWall = R.drawable.wall003;
}else if(wall_list.equals("wall001")){
mWall = R.drawable.wall001;
…その他変更処理いろいろ
onCreate(getSurfaceHolder());
onSurfaceCreated(getSurfaceHolder());
}
まー、drawのメソッドがないならもう一回surfaceをCreateすればええんちゃう?
とやってみたら、ダメでした。そらそーだ、これだと初回読み込みとかにも
エラー出るし、この状態でパーティクルの再描画もしたら変更した瞬間に
処理が追いつかなくてオーバーフローでした。
で、↑を↓に変えたらOKでした。
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
{
String wall_list = sharedPreferences.getString("list_key","wall001"); //preference.xmlに設定したキーと初期値
if(wall_list.equals("wall002")){ //処理いろいろ。ここではリストから選択して壁紙変更
mWall = R.drawable.wall002;
}else if(wall_list.equals("wall003")){
mWall = R.drawable.wall003;
}else if(wall_list.equals("wall001")){
mWall = R.drawable.wall001;
}
…その他変更処理いろいろ
}
if(gl != null){
onSurfaceDestroyed(getSurfaceHolder());
onCreate(getSurfaceHolder());
onSurfaceCreated(getSurfaceHolder());
onVisibilityChanged(false);
}
}
やったこと
・最後のif文で、glがnullじゃないときのみ再描画処理を行う(初回起動対策)
ここでいうglはThreadを継承したOpenGLの開始処理とかを行うクラス。
ていうか本に載ってるママの変数。
・if文で判別したら、再描画処理するんだけど、まずは
onSurfaceDestroyed、で破壊→そののちにonCreate。単なる
draw処理じゃなくて一度破棄しないとダメみたい。
・最後にonVisibilityChangedでポーズ状態にする。
これをしないと変更した瞬間に、変更画面のままパーティクルが動きまくって
処理エラーになります。(何を隠そうここが一番ハマった)
同じ本を使って作っている人の参考になれば幸いです。
そして多分もっといい方法があると思うので教えてくれる素敵な
人たちを募集中です。