▼Androidメモ▼
ライブ壁紙


ライブ壁紙を作成する。


リソース
「sample.png」を「res/drawable」に挿入。

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

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

ソースコード
LiveWallpaperEx.java
package net.npaka.livewallpaperex;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;
import android.content.res.Resources;

//ライブ壁紙
public class LiveWallpaperEx extends WallpaperService {
//ライブ壁紙エンジン生成時に呼ばれる
@Override
public WallpaperService.Engine onCreateEngine() {
return new WallpaperEngine(getResources());
}

//ライブ壁紙エンジン
public class WallpaperEngine extends WallpaperService.Engine
implements Runnable {
private SurfaceHolder holder;//サーフェイスホルダー
private Thread thread;//スレッド

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

private int width; //幅
private int height; //高さ

//コンストラクタ
public WallpaperEngine(Resources r) {
image=BitmapFactory.decodeResource(r,R.drawable.sample);
}

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

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

//表示状態変更時に呼ばれる
@Override
public void onVisibilityChanged(boolean visible) {
if (visible) {
//スレッドの開始
thread=new Thread(this);
thread.start();
} else {
//スレッドの停止
thread=null;
}
}

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

//ループ処理
public void run() {
while(thread!=null) {
long nextTime=System.currentTimeMillis()+30;
onTick();
try {
Thread.sleep(nextTime-System.currentTimeMillis());
} catch (Exception e) {
}
}
}

//定期処理
private void onTick() {
//ダブルバッファリング
Canvas canvas=holder.lockCanvas();
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(image,px-120,py-120,null);
holder.unlockCanvasAndPost(canvas);

//移動
if (px<0 || width <px) vx=-vx;
if (py<0 || height<py) vy=-vy;
px+=vx;
py+=vy;
}
}
}

AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.npaka.livewallpaperex"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<service
android:name=".LiveWallpaperEx"
android:label="@string/app_name"
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>

</manifest>

−戻る−