▼Androidメモ▼
ライブウォールペーパーの作成


ライブウォールペーパーを作成する。


ライブウォールペーパーの設定

  1. ホームのウィジェットのない空き領域を長押し。
  2. ポップアップ「Wallpapers」を選択。
  3. ポップアップ「Live wallpapers」を選択。
  4. 設定したいライブウォールペーパーを選択。
リソース
「sample.gif」を「res/drawable」に挿入。

sample.gif
「wallpaper.xml」を「res/xml」に挿入。

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />

ソースコード
WallpaperEx.java
package net.npaka.wallpaperex;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;
import android.content.res.*;

//ライブウォールペーパーの利用
public class WallpaperEx extends WallpaperService {
    //生成時に呼ばれる
    @Override
    public void onCreate() {
        super.onCreate();
    }

    //破棄時に呼ばれる
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    //エンジン生成時に呼ばれる
    @Override
    public Engine onCreateEngine() {
        return new WallpaperEngine(getResources());
    }

    //ライブウォールペーパーエンジン
    public class WallpaperEngine extends Engine {
        private final Handler handler=new Handler();        

        private Bitmap image;//イメージ
        private int    px=0; //X座標
        private int    py=0; //Y座標
        private int    vx=10;//X速度
        private int    vy=10;//Y速度

        private boolean visible;//表示状態
        private int     width;  //幅
        private int     height; //高さ

        //描画スレッド
        private final Runnable drawThread=new Runnable() {
            public void run() {
                drawFrame();
            }
        };

        //コンストラクタ
        public WallpaperEngine(Resources r) {
            image=BitmapFactory.decodeResource(r,R.drawable.sample);
        }
        
        //生成時に呼ばれる
        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);
        }

        //破棄時に呼ばれる
        @Override
        public void onDestroy() {
            super.onDestroy();
            handler.removeCallbacks(drawThread);
        }

        //表示状態変更時に呼ばれる
        @Override
        public void onVisibilityChanged(boolean visible) {
            this.visible=visible;
            if (visible) {
                drawFrame();
            } else {
                handler.removeCallbacks(drawThread);
            }
        }

        //サーフェイス変更時に呼ばれる
        @Override
        public void onSurfaceChanged(SurfaceHolder holder,
            int format,int width,int height) {
            super.onSurfaceChanged(holder,format,width,height);
            this.width =width;
            this.height=height;
            drawFrame();
        }

        //サーフェイス生成時に呼ばれる
        @Override
        public void onSurfaceCreated(SurfaceHolder holder) {
            super.onSurfaceCreated(holder);
        }

        //サーフェイス破棄時に呼ばれる
        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            visible=false;
            handler.removeCallbacks(drawThread);
        }

        //オフセット変更時に呼ばれる
        @Override
        public void onOffsetsChanged(float xOffset,float yOffset,
            float xStep,float yStep,int xPixels,int yPixels) {
            drawFrame();
        }

        //フレームの描画
        private void drawFrame() {
            //ロック
            SurfaceHolder holder=getSurfaceHolder();
            Canvas c=holder.lockCanvas();

            //描画
            c.drawColor(Color.WHITE);
            c.drawBitmap(image,px-57,py-57,null);

            //アンロック
            holder.unlockCanvasAndPost(c);
                    
            //移動
            if (px<0 || width <px) vx=-vx;
            if (py<0 || height<py) vy=-vy;
            px+=vx;
            py+=vy;
                
            //再描画
            handler.removeCallbacks(drawThread);
            if (visible) handler.postDelayed(drawThread,100);
        }
    }
}


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.npaka.wallpaperex"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <service
            android:label="@string/app_name"
            android:name=".WallpaperEx"
            android:permission="android.permission.BIND_WALLPAPER">
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>
            <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" />            
        </service>
    </application>
    <uses-sdk android:minSdkVersion="7" />
</manifest>
      

−戻る−