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