これは想像以上に面白いことができそうな機能です。
オリジナルアプリも作ってみたいと思いました。
・android2.1以上で実装する必要がある
・xmlは結構煩雑
サービスクラスを作成し、パーミッション「android:permission="android.permission.BIND_WALLPAPER"」の設定が必要
Serviceのintent-filterに
meta-dataでLiveWallpaperのリソースを定義。これはres/xml/に作成。wallpaper.xmlとするのが一般的で良いと思う。
ServiceクラスはWallpaperServiceクラスを継承する。
・壁紙の解像度の取得
width:getWallpaperDesiredMinimumWidth()
height:getWallpaperDesiredMinimumHeight()
動きの処理はEngineを継承したクラスを利用する。
EngineはSurfaceViewの使い方とほぼ同じ。androidでゲームプログラミングを組んだことがある人だと、若干とっつき易い。
・各メソッドの動き
onOffsetsChangedが
スライドさせたときに呼びだされている模様
http://d.hatena.ne.jp/hyoromo/20100513/1273768279
上記のサイトで記述されているHomeScreenは違うのではないか?
取得できるoffsetはどれだけ移動したかの値。距離の差。あんま使わなさそう。
xPixelsでは、絶対値の位置が取得できるようである。
値はandroidOS2.3で確認。左端で0、右端で-320。
HomeScreenが右に一つ切り替わると、-80xPixels移動する(加算される)。
なので、0 > 変数 > -80
のような感じで現在のhomeScreenの場所を特定できると思われる。
コーディングしてみたら、やはりうまくいった。
ソースはもっと深く理解して汎用性を持たせてからUPしよう…。汚すぎ。
homeScreenが4の場合は、
HVGAの場合、width(480 × 4)のサイズの画像を用意するといいのだろう。
アプリのようにlayoutでごまかせないので、端末ごとに画像を用意する必要がある。
onOffsetsChangedメソッドで取得された値に応じて、canvasに設定するx(left)値の値を計算する。そして、canvasでxの値を設定してやるとうまく動く。あとはアニメーションを用意すればOKっぽい。
ただし、ずっとスレッドを走らせておくのは電池消費的によくない。。
なので、タッチで動かしたときだけ動作させるのが良いと思われる。
色々なLive Wallpaperアプリを見てみたけど、コカコーラのLiveWallpaperが現在の完成度では一番かな。
興味ある人は、「cocacola」で検索してダウンロードしてみてはいかがでしょうか。かっこいいですよ。
OpenGLを使ってグリグリ動かしているんだろうなあ。3Dプログラミングはわからんから、勉強しないといけない。
というわけでメモ終了。
0 件のコメント:
コメントを投稿