`
crazysumer
  • 浏览: 49614 次
社区版块
存档分类
最新评论

【安卓笔记】Live Wallpaper 二:天上掉下一只猫

 
阅读更多


 掉小猫的功能实现了,思路是,每隔一段时间,产生一堆小猫,放到链表中,再不断地去重绘这些小猫,小猫离开屏幕了,就把小猫从链表中赶走。

先看动态效果图



 

 

主要的代码,其余的配置跟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

 

 

 

 

  • 大小: 286.3 KB
  • 大小: 293.1 KB
  • 大小: 383.7 KB
分享到:
评论

相关推荐

    Wallpaper Engine:壁纸引擎.url

    Wallpaper Engine:壁纸引擎.url

    Android代码-Live-Wallpaper-App

    LiveWallpaper Live Wallpaper App using OpenGL ES 2.0

    两个Android 动态壁纸 Live Wallpaper例子

    在Android平台上,动态壁纸(Live Wallpaper)是一种可以让用户自定义主屏幕背景的高级功能,它不仅限于静态图片,还能展示动画或者交互式效果。本压缩包提供的"两个Android 动态壁纸 Live Wallpaper-...

    Android 动态壁纸 Live Wallpaper

    Android动态壁纸,或者说“Live Wallpaper”,是Android操作系统中一种特殊的应用类型,允许用户将动态、交互式的背景设置为手机或平板电脑的主屏幕壁纸。这种壁纸不仅提供了静态图像的视觉体验,还可以根据用户的...

    Android动态桌面LiveWallpaper

    在Android系统中,动态桌面(Live Wallpapers)是一种可以为用户提供动态视觉效果的壁纸类型,与静态壁纸不同,它可以展示动画、3D图形或其他交互式元素。本教程将深入探讨如何制作Android动态壁纸,主要围绕以下几...

    android live wallpaper 教程

    - 创建一个XML文件(通常命名为`wallpaper.xml`),放置于`res/xml/`目录下。 - 在此文件中定义壁纸的基本信息,如缩略图、描述文本和设置活动。 4. **绘制壁纸**: - 在`Engine`类中重写`onDraw()`方法来绘制...

    华丽 桌面插件 Ditalix Live Wallpaper Suite 1.2.3.10

    桌面插件 Ditalix Live Wallpaper Suite 1.2.3.10-华丽动态壁纸集合 ICON:软件icon 软件名称:Ditalix Live Wallpaper Suite 软件版本:1.2.3.10~华丽动态壁纸集合 软件大小:31.27M 软件语言:英文 支持平台:...

    Android 仿火萤视频桌面 神奇的LiveWallPaper

    Android 仿火萤视频桌面 神奇的LiveWallPaper

    Creating Android live wallpaper

    在Android平台上,动态壁纸(Live Wallpaper)是一种可以让用户自定义主屏幕背景的特殊类型的应用程序。它们不仅可以显示静态图像,还可以展示动态效果、交互式动画或者其他复杂视觉元素。本篇文章将深入探讨如何...

    X Live Wallpaper X动态壁纸v3.7 高级版.zip

    《X Live Wallpaper X动态壁纸v3.7 高级版》是一个专为手机或平板设备设计的高级动态壁纸应用。该应用提供了丰富的个性化选项,让用户能够定制自己的桌面背景,为移动设备增添生动有趣的视觉效果。v3.7版本可能是该...

    TZM-Android-LiveWallpaper:时代精神运动动态壁纸为Android-开源

    “TZM-Android-LiveWallpaper”是一个专为Android系统设计的开源动态壁纸应用,其核心理念是融入了“时代精神运动”(Zeitgeist Movement)的理念。这款应用将艺术与技术完美结合,为用户的手机桌面带来生动且富有...

    Video Live Wallpaper_v1.4.1

    《Video Live Wallpaper_v1.4.1》是一款专为Android用户设计的动态壁纸应用,它提供了丰富的视频背景,让用户的手机桌面生动起来。这款软件在MIUI、FM、GALAXY以及EIMU等常见Android系统上都可以流畅运行,为用户...

    LiveWallpaper.apk

    LiveWallpaper.apk

    android -wallpaper (墙纸)

    本文将深入探讨Android系统中的墙纸功能,以及如何利用Android SDK进行LiveWallpaper的开发。 首先,Android壁纸分为静态壁纸和动态壁纸两种。静态壁纸是常见的图片形式,用户可以从本地相册选择或下载网络上的图片...

    project_lw:Android LiveWallpaper Manager,安卓动态壁纸管理器

    Android 端强大的动态壁纸管理器 :sparkles: 特性 :check_mark_button: 使用 Flutter 开发 :globe_showing_Americas: 支持 HTML 、URL 作为 Android 壁纸 :television: 支持视频作为 Android 壁纸 :hammer_and_...

    Android动态桌面LiveWallpaper源代码

    一个Android动态桌面源码,文件名LiveWallpaper,可以循环改变Android手机的待机桌面,选择一些漂亮的图片作为桌面,喜欢个性化的手机玩家,对此是想当热衷的,Android的自定义功能和桌面应用类软件也想当丰富,此...

Global site tag (gtag.js) - Google Analytics