掉小猫的功能实现了,思路是,每隔一段时间,产生一堆小猫,放到链表中,再不断地去重绘这些小猫,小猫离开屏幕了,就把小猫从链表中赶走。
先看动态效果图
主要的代码,其余的配置跟Live Wallpaper一是一样的
public class MyWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyEngine();
}
class MyEngine extends Engine {
private Handler h = new Handler();
private int screenWidth;
private int screenHeight;
private Paint p;
private Canvas c;
private Bitmap bg;
private ArrayList<Cat> cats;
private int time = 60;
private int timer = 0;
// 用一个线程来处理绘制动态壁纸的过程
Runnable dThread = new Runnable() {
@Override
public void run() {
createCats();
drawWallpaper();
}
};
/*
* 工具方法,用于将raw中的资源转化成Bitmap类型
*/
private Bitmap loadBitmap(int id) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id);
return bitmap;
}
private void drawWallpaper() {
SurfaceHolder holder = getSurfaceHolder();
c = holder.lockCanvas();
if (c != null) {
c.drawBitmap(bg, 0, 0, p);// 画出背景
//循环遍历数组,不断地重绘产生的猫咪
for (Cat it : cats) {
it.drawCat(c);
}
holder.unlockCanvasAndPost(c);
}
h.postDelayed(dThread, 20);
}
private void createCats() {
// 画出动态的猫咪,这里timer跟time也是为了让这段产生小猫的代码不断的执行,同时也不妨碍赶走小猫
timer++;
if (timer >= time) {
int px = (int) (Math.random() * screenWidth);
Cat cat1 = new Cat(loadBitmap(R.drawable.p_01));
// Cat cat2 = new Cat(loadBitmap(R.drawable.p_02));
Cat cat3 = new Cat(loadBitmap(R.drawable.p_03));
if (cat1 != null) {
cat1.drawCat(c);
cat1.setPosition(px, 0);
cats.add(cat1);
}
/*
* px = (int) (Math.random() * screenWidth);
*
* if (cat2 != null) { cat2.drawCat(c); cat2.setPosition(px, 0);
* cats.add(cat2); }
*/
px = (int) (Math.random() * screenWidth);
if (cat3 != null) {
cat3.drawCat(c);
cat3.setPosition(px, 0);
cats.add(cat3);
}
timer = 0;
}
//记得把超出屏幕的猫咪赶走
for (int i = 0; i < cats.size(); i++) {
if (cats.get(i).positionY > screenHeight) {
cats.remove(i);
}
}
}
public MyEngine() {
p = new Paint();
p.setColor(Color.RED);
p.setAntiAlias(true);
p.setStyle(Style.STROKE);
p.setStrokeWidth(3);
p.setTextSize(30);
bg = loadBitmap(R.drawable.bg1);
cats = new ArrayList<MyWallpaperService.Cat>();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
Log.i("MyEngine----------", "engine created");
super.onCreate(surfaceHolder);
setTouchEventsEnabled(true);
}
/**
* 调用SurfaceHolder.Callback中的回调函数surfaceCreated
* */
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
Log.i("MyEngine----------", "surface created");
super.onSurfaceCreated(holder);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
if (width > 0 && height > 0) {
this.screenWidth = width;
this.screenHeight = height;
}
super.onSurfaceChanged(holder, format, width, height);
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
if (visible) {
h.postDelayed(dThread, 20);
} else {
h.removeCallbacks(dThread);
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
Log.i("MyEngine----------", "surface destoryed");
super.onSurfaceDestroyed(holder);
h.removeCallbacks(dThread);
}
@Override
public void onDestroy() {
Log.i("MyEngine----------", "engine destoryed");
super.onDestroy();
h.removeCallbacks(dThread);
}
@Override
public void onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
h.postDelayed(dThread, 20);
}
}
/**
* 用一个类来封装猫咪图片的信息
* */
public class Cat {
Bitmap sourceBitmap;
int positionX = 0;// 图片上角的X坐标
int positionY = 0;// 图片左上角的Y坐标
// 设置猫咪图片的位置
public void setPosition(int x, int y) {
positionX = x;
positionY = y;
}
public Cat(Bitmap bitmap) {
sourceBitmap = bitmap;
}
// 画猫咪图片
public void drawCat(Canvas canvas) {
if (sourceBitmap != null) {
canvas.drawBitmap(sourceBitmap, positionX, positionY, null);
}
nextFrame();
}
// 下一帧
public void nextFrame() {
positionY += 1;
}
}
}
虽然有密集恐惧症,可是看到猫咪的图片不会,果然是萌物啊
传送门:
http://zhujiao.iteye.com/blog/1537528