一开始我就想弄个几只小猫往下掉(或者飘?)的效果,小猫都有了,愣是没弄出来(我对不住你们,喵众猫:)
于是现在变成了系统时间(还是没有格式化的那种)在不停跑啊跑
要制作动态壁纸
1.需要继承WallpaperService,这个Service里主要用Engine来实现动态壁纸
2.这个Engine,看到网上说生命周期是onCreate->onSurfaceCreated->onSurfaceDestroyed->onDestroyed,好嘛,我暂时不知道他对不对,不过我就没写onVisibilityChanged,然后出错了(还是很诡异的错)
3.自己要做长时间的刷新某个东东的事,写到一个线程中,用Handler去控制
首先建MyWallpaperService 这个类
public class MyWallpaperService extends WallpaperService { @Override public Engine onCreateEngine() { return new MyEngine(); } /* * surface,就叫他一个表层吧,要用一个surfaceholder来操作这个表层,这个holder可以绑定一个画布, * 这么说,就把这个holder比作双面胶,把画布给粘到表层上, * 至于在画布上作画的事,就要用笔(paint)来了 * */ class MyEngine extends Engine { private Handler h = new Handler(); private Paint p; private Canvas c; // 用一个线程来处理绘制动态壁纸的过程 Runnable dThread = new Runnable() { @Override public void run() { drawWallpaper(); } }; private void drawWallpaper() { SurfaceHolder holder = getSurfaceHolder(); c = holder.lockCanvas(); c.drawColor(Color.WHITE); drawTime(c); holder.unlockCanvasAndPost(c); h.postDelayed(dThread, 100); } private void drawTime(Canvas c) { long l = System.currentTimeMillis(); c.drawText(l + "", 200, 300, p); /* * Saves the current matrix and clip onto a private stack. * */ // c.save(); /* * This call balances a previous call to save(), and is used to * remove all modifications to the matrix/clip state since the last * save call. */ // c.restore(); /* * 所以,这一段对matrix/clip的保存跟移除是个什么意义呢?暂不明,貌似不影响效果 * */ // Log.d("绘制时间", "draw time"); } public MyEngine() { p = new Paint(); p.setColor(Color.RED); p.setAntiAlias(true); p.setStyle(Style.STROKE); p.setStrokeWidth(3); p.setTextSize(30); } @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); } /** * 这个方法是必须实现的,要不然会一直显示"正在载入动态壁纸..." Called to inform you of the * wallpaper becoming visible or hidden. It is very important that a * wallpaper only use CPU while it is visible.. * 虽然还不太懂为什么,但人家说了,很重要,只有可见的时候才能占用CPU,为了性能也必须实现 * */ @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); if (visible) { h.postDelayed(dThread, 100); } 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); } } }
在AndroidManifest.xml中去配置这个service,intent-filter中action的name跟meta-data中的name都是API中推荐(还是叫规定?)的
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.saya.mylivewallpaper" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-feature android:name="android.software.live_wallpaper" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name=".MyWallpaperService" android:enabled="true" android:icon="@drawable/p_01" android:label="天上掉下一只猫" android:permission="android.permission.BIND_WALLPAPER" > <intent-filter android:priority="1" > <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> </application> </manifest>
在res下新建xml文件夹,在文件夹中建wallpaper.xml,即上面meta-data中resource中用到的,就是对你自己的这个动态壁纸的一些设置吧
<?xml version="1.0" encoding="UTF-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/p_01" />
这个thumbnail的作用,就是出现下面这只小猫
嗯,这样就算完了
上面提到的错误,logcat没有报错,每次程序运行就停留在这个界面,坑爹
传送门:
牛逼轰轰的一个:http://mzh3344258.blog.51cto.com/1823534/806560
生命周期出自:http://www.ophonesdn.com/article/show/278
另外:http://www.cnblogs.com/carmanloneliness/archive/2012/03/10/2388500.html
http://www.oschina.net/question/157182_37775
相关推荐
两个Android 动态壁纸 Live Wallpaper-WallpaperService
LiveWallpaper Live Wallpaper App using OpenGL ES 2.0
NULL 博文链接:https://crazysumer.iteye.com/blog/1847287
动态壁纸的制作
Android 动态壁纸 Live Wallpaper 工程 源代码
Ditalix Live Wallpaper Suite是一款动态壁纸集合,内置了多种效果的壁纸,滑动屏幕有动态效果。 Ditalix是一家集设计与定制心态的动态壁纸。折叠的形状刷和多点触摸手势在屏幕上轻点。 产品特点:★定期更新与自由...
Android 仿火萤视频桌面 神奇的LiveWallPaper
一个弹球效果的简单动态壁纸示例apk;一个弹球效果的简单动态壁纸示例apk;一个弹球效果的简单动态壁纸示例apk;
android-live-wallpaper 教你怎么写动态壁纸 博文链接:https://gundumw100.iteye.com/blog/904176
android动态桌面的创建教程。有兴趣的朋友可拿来参考一下。
一个Android动态桌面源码,文件名LiveWallpaper,可以循环改变Android手机的待机桌面,选择一些漂亮的图片作为桌面,喜欢个性化的手机玩家,对此是想当热衷的,Android的自定义功能和桌面应用类软件也想当丰富,此...
Infinity Live Wallpaper.apk
Unity BitPaper Live Wallpaper 动态墙纸,实现绚丽的动态墙纸
Android 端强大的动态壁纸管理器 :sparkles: 特性 :check_mark_button: 使用 Flutter 开发 :globe_showing_Americas: 支持 HTML 、URL 作为 Android 壁纸 :television: 支持视频作为 Android 壁纸 :hammer_and_...
livewallpaper_i18n
LiveWallpaper_Rem
X Live Wallpaper X动态壁纸v3.7 高级版.zip含下载地址可存云盘
Huawei_Mate_20_Live_Wallpapers_by_XDA_com_huawei_livewallpaper_matetwenty.apk