掉小猫的功能实现了,思路是,每隔一段时间,产生一堆小猫,放到链表中,再不断地去重绘这些小猫,小猫离开屏幕了,就把小猫从链表中赶走。
先看动态效果图
主要的代码,其余的配置跟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
相关推荐
Wallpaper Engine:壁纸引擎.url
LiveWallpaper Live Wallpaper App using OpenGL ES 2.0
两个Android 动态壁纸 Live Wallpaper-WallpaperService
动态壁纸的制作
桌面插件 Ditalix Live Wallpaper Suite 1.2.3.10-华丽动态壁纸集合 ICON:软件icon 软件名称:Ditalix Live Wallpaper Suite 软件版本:1.2.3.10~华丽动态壁纸集合 软件大小:31.27M 软件语言:英文 支持平台:...
Android 动态壁纸 Live Wallpaper 工程 源代码
Android 仿火萤视频桌面 神奇的LiveWallPaper
android-live-wallpaper 教你怎么写动态壁纸 博文链接:https://gundumw100.iteye.com/blog/904176
一个弹球效果的简单动态壁纸示例apk;一个弹球效果的简单动态壁纸示例apk;一个弹球效果的简单动态壁纸示例apk;
android动态桌面的创建教程。有兴趣的朋友可拿来参考一下。
Android 端强大的动态壁纸管理器 :sparkles: 特性 :check_mark_button: 使用 Flutter 开发 :globe_showing_Americas: 支持 HTML 、URL 作为 Android 壁纸 :television: 支持视频作为 Android 壁纸 :hammer_and_...
一个Android动态桌面源码,文件名LiveWallpaper,可以循环改变Android手机的待机桌面,选择一些漂亮的图片作为桌面,喜欢个性化的手机玩家,对此是想当热衷的,Android的自定义功能和桌面应用类软件也想当丰富,此...
Infinity Live Wallpaper.apk
Unity BitPaper Live Wallpaper 动态墙纸,实现绚丽的动态墙纸
这与大多数教程中所说的“构建一个安卓视频墙纸”不同,它不是一个演示,只是创建了一个以WallpaperSurface为目的地的MediaPlayer。 MediaPlayer无法裁剪视频,而是仅在屏幕上填充视频帧,并保留音频通道。 我使用...