android 动态壁纸开发
转:http://www.eoeandroid.com/thread-100389-1-1.html
android 动态壁纸开发
参考:http://www.ophonesdn.com/article/show/278
推荐:http://www.oschina.net/code/snippet_203635_7426
http://blog.csdn.net/homebei2/article/details/6079580
resources/articles/live-wallpapers.html
自己做了一个非常简单的 只是想了解过程 源码见附件 步骤如下:
1、新建一个Android工程 然后进入工程的/res/文件夹,删除layout这个文件夹,当然里面的main.xml也会被删除的,对于Live Wallpaper来说传统的布局文件是不需要的。
2、在res下面新建一个xml文件夹 然后新建一个mylivewallpaper.xml 内容如下:
Java代码
- <?xml version="1.0" encoding="utf-8"?>
- <wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
- android:thumbnail="@drawable/icon"
- />
复制代码
这里的android:thumbnail值得是你这个动态壁纸的小图标 会在你选着动态壁纸的时候出现 如下图:
这个可以自己选一个好看一点的
3、开始编写代码了 直接看吧
Java代码
- package com.lp.wallpaper;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.os.Bundle;
- import android.os.Handler;
- import android.service.wallpaper.WallpaperService;
- import android.view.MotionEvent;
- import android.view.SurfaceHolder;
- public class MyWallpaper extends WallpaperService{
- private Handler handler = new Handler();
- @Override
- public void onCreate() {
- System.out.println("service onCreate");
- super.onCreate();
- }
- @Override
- public void onDestroy() {
- System.out.println("service onDestory");
- super.onDestroy();
- }
- @Override
- public Engine onCreateEngine() {
- System.out.println("service onCreateEngine");
- return new MyEngine();
- }
- private class MyEngine extends Engine{
- private float x = 200;
- private float y = 300;
- private Paint mPaint;
- private boolean mVisible = false;
- private Runnable drawThread = new Runnable() {
- public void run() {
- drawWallpaper();
- }
- };
- public MyEngine(){
- System.out.println("MyEngine");
- mPaint = new Paint();
- mPaint.setColor(Color.RED);
- mPaint.setAntiAlias(true);
- mPaint.setStrokeWidth(4);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setTextSize(24);
- }
- @Override
- public Bundle onCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested) {
- // TODO Auto-generated method stub
- System.out.println("onCommand");
- return super.onCommand(action, x, y, z, extras, resultRequested);
- }
- @Override
- public void onCreate(SurfaceHolder surfaceHolder) {
- System.out.println("onCreate");
- super.onCreate(surfaceHolder);
- //作用是使壁纸能响应touch event,默认是false
- setTouchEventsEnabled(true);
- }
- @Override
- public void onDestroy() {
- System.out.println("onDestroy");
- super.onDestroy();
- handler.removeCallbacks(drawThread);
- }
- @Override
- public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
- // TODO Auto-generated method stub
- System.out.println("onoffsetsChanged");
- super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
- }
- @Override
- public void onVisibilityChanged(boolean visible) {
- System.out.println("onVisibilityChanged");
- mVisible = visible;
- if (visible) {
- //开始
- handler.postDelayed(drawThread, 50);
- } else {
- handler.removeCallbacks(drawThread);
- }
- }
- @Override
- public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- System.out.println("onSurfaceChanged");
- // TODO Auto-generated method stub
- super.onSurfaceChanged(holder, format, width, height);
- }
- @Override
- public void onSurfaceCreated(SurfaceHolder holder) {
- System.out.println("onSurfaceCreated");
- super.onSurfaceCreated(holder);
- }
- @Override
- public void onSurfaceDestroyed(SurfaceHolder holder) {
- System.out.println("onSurfaceDestoryed");
- // TODO Auto-generated method stub
- super.onSurfaceDestroyed(holder);
- handler.removeCallbacks(drawThread);
- }
- @Override
- public void onTouchEvent(MotionEvent event) {
- System.out.println("onTouchEvent");
- // TODO Auto-generated method stub
- super.onTouchEvent(event);
- }
- private void drawWallpaper() {
- SurfaceHolder holder = getSurfaceHolder();
- Canvas canvas = holder.lockCanvas();
- drawTime(canvas);
- holder.unlockCanvasAndPost(canvas);
- //循环执行
- handler.postDelayed(drawThread, 50);
- }
- private void drawTime(Canvas canvas) {
- Date date = new Date(System.currentTimeMillis());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
- String dataStr = sdf.format(date);
- canvas.save();
- canvas.drawColor(0xff00ff00);
- canvas.drawText(dataStr, x, y, mPaint);
- canvas.restore();
- }
- }
- }
复制代码
实现的效果是一个动态改变的时间 如下图:
我们一一来解释:
onCreateEngine() :
启动一个WallpaperService.Engine 这个engine才是负责绘制壁纸以及响应与用户交互事件的核心部件 这个方法也是必须要重写的 并且是WallpaperService和service的主要区别
onOffsetsChanged():
这个一般在几个屏幕滑动的时候调用 而且 当你拖动A屏幕向B屏幕过度时 会随着B屏幕的显示面积的变大或者变小一直调用这个方法
onVisibilityChanged()
这个是屏幕显示或者不显示的时候调用的 必须完全覆盖屏幕才会调用
onCommand()
可以给壁纸发送一些命令 让其执行
onTouchEvent()
处理壁纸的点击时间的
setTouchEventsEnabled(true)
作用是使壁纸能响应touch event,默认是false
其他的看名字应该就知道了 呵呵
这里也说下Engine的惯用写法吧
Java代码
- private class MyEngine extends Engine{
- //这里定义一个线程
- private Runnable drawThread = new Runnable() {
- public void run() {
- drawWallpaper();
- }
- };
- //构造方法里面 一般初始化Paint对象
- public MyEngine(){
- System.out.println("MyEngine");
- mPaint = new Paint();
- mPaint.setColor(Color.RED);
- mPaint.setAntiAlias(true);
- mPaint.setStrokeWidth(4);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setTextSize(24);
- }
- //这里 调用setTouchEventsEnabled(true);即可
- @Override
- public void onCreate(SurfaceHolder surfaceHolder) {
- System.out.println("onCreate");
- super.onCreate(surfaceHolder);
- //作用是使壁纸能响应touch event,默认是false
- setTouchEventsEnabled(true);
- }
- //取消callback
- @Override
- public void onDestroy() {
- System.out.println("onDestroy");
- super.onDestroy();
- handler.removeCallbacks(drawThread);
- }
- //当显示的时候 绑定callback 不显示时 取消callback
- @Override
- public void onVisibilityChanged(boolean visible) {
- System.out.println("onVisibilityChanged");
- mVisible = visible;
- if (visible) {
- //开始
- handler.postDelayed(drawThread, 50);
- } else {
- handler.removeCallbacks(drawThread);
- }
- }
- @Override
- public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- System.out.println("onSurfaceChanged");
- // TODO Auto-generated method stub
- super.onSurfaceChanged(holder, format, width, height);
- }
- @Override
- public void onSurfaceCreated(SurfaceHolder holder) {
- System.out.println("onSurfaceCreated");
- super.onSurfaceCreated(holder);
- }
- //取消callback
- @Override
- public void onSurfaceDestroyed(SurfaceHolder holder) {
- System.out.println("onSurfaceDestoryed");
- // TODO Auto-generated method stub
- super.onSurfaceDestroyed(holder);
- handler.removeCallbacks(drawThread);
- }
- //处理点击事件 比如说 点击时 出现水波等
- @Override
- public void onTouchEvent(MotionEvent event) {
- System.out.println("onTouchEvent");
- // TODO Auto-generated method stub
- super.onTouchEvent(event);
- }
- //得到surfaceholder和canvas 并调用核心处理方法
- private void drawWallpaper() {
- SurfaceHolder holder = getSurfaceHolder();
- Canvas canvas = holder.lockCanvas();
- drawTime(canvas);
- holder.unlockCanvasAndPost(canvas);
- //循环执行
- handler.postDelayed(drawThread, 50);
- }
- //核心处理方法
- private void drawTime(Canvas canvas) {
- }
- }
复制代码
4、在AndroidManifes.xml里面注册service
Java代码
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.lp.wallpaper">
- <uses-sdk android:minSdkVersion="7" />
- <uses-feature android:name="android.software.live_wallpaper" />
- <application
- android:icon="@drawable/icon"
- android:label="@string/app_name">
- <service
- android:label="@string/app_name"
- android:name=".MyWallpaper"
- android:permission="android.permission.BIND_WALLPAPER">
- <intent-filter>
- <action android:name="android.service.wallpaper.WallpaperService" />
- </intent-filter>
- <meta-data android:name="android.service.wallpaper" android:resource="@xml/mylivewallpaper" />
- </service>
- </application>
- </manifest>
复制代码
除了
- android:resource="@xml/mylivewallpaper"
复制代码
是可以自己修改 其他的都是必须得 特别强调几个:
- <uses-sdk android:minSdkVersion="7" />
- <uses-feature android:name="android.software.live_wallpaper" />
- android:permission="android.permission.BIND_WALLPAPER"
复制代码
5、自己的一些关于方法执行顺序的测试信息:
当进入改壁纸的设置页面 但是还没有设置时
09-21 07:55:05.575: INFO/System.out(1337): service onCreate
09-21 07:55:05.614: INFO/System.out(1337): service onCreateEngine
09-21 07:55:05.634: INFO/System.out(1337): MyEngine
09-21 07:55:05.663: INFO/System.out(1337): onCreate
09-21 07:55:05.746: INFO/System.out(1337): onSurfaceCreated
09-21 07:55:05.753: INFO/System.out(1337): onSurfaceChanged
09-21 07:55:05.785: INFO/System.out(1337): onVisibilityChanged
当点击设置壁纸按钮后
09-21 07:55:19.434: INFO/System.out(1337): onTouchEvent
09-21 07:55:19.574: INFO/System.out(1337): onTouchEvent
09-21 07:55:20.283: INFO/System.out(1337): service onCreateEngine
09-21 07:55:20.294: INFO/System.out(1337): MyEngine
09-21 07:55:20.304: INFO/System.out(1337): onCreate
09-21 07:55:20.414: INFO/System.out(1337): onSurfaceCreated
09-21 07:55:20.424: INFO/System.out(1337): onSurfaceChanged
09-21 07:55:20.443: INFO/System.out(1337): onVisibilityChanged
09-21 07:55:20.443: INFO/System.out(1337): onoffsetsChanged
09-21 07:55:20.863: INFO/System.out(1337): onVisibilityChanged
09-21 07:55:21.305: INFO/System.out(1337): onSurfaceDestoryed
09-21 07:55:21.333: INFO/System.out(1337): onDestroy
在壁纸上面点击
09-21 07:55:34.654: INFO/System.out(1337): onTouchEvent
09-21 07:55:34.754: INFO/System.out(1337): onTouchEvent
09-21 07:55:34.754: INFO/System.out(1337): onCommand
启动其他程序 完全覆盖屏幕
09-21 07:56:03.855: INFO/System.out(1337): onTouchEvent
09-21 07:56:03.884: INFO/System.out(1337): onTouchEvent
09-21 07:56:04.494: INFO/System.out(1337): onVisibilityChanged
设置其他壁纸 代替自己的壁纸
09-21 07:56:34.893: INFO/System.out(1337): onSurfaceDestoryed
09-21 07:56:34.893: INFO/System.out(1337): onDestroy
09-21 07:56:34.953: INFO/System.out(1337): service onDestory
转载于:https://www.cnblogs.com/leihupqrst/p/3978085.html
android 动态壁纸开发相关推荐
- Android 动态壁纸开发(时钟)
Android 动态壁纸开发(时钟) 这是我人生第一篇文章,希望大家不喜无喷啊!有兴趣的可以看看玩,因为语言组织能力有限,就废话不多说直接进入重点! 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看 ...
- android动态壁纸引擎,Android动态壁纸开发
新建一个Android项目: 完成下面步骤后,安装到手机,并设置动态壁纸才能看到效果. res/xml/cube1.xml AndroidManifest.xml CubeWallpaper1.jav ...
- Android自定义壁纸预览界面,Android自定义动态壁纸开发(时钟)
看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android ...
- android动态壁纸的制作
对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面加入了更好的动态效果.如何开发一个Android动态桌面呢? 下面Android123给大家一个详细的步骤 ...
- Android动态壁纸解析
转载自 Yalin Jin的文章:http://www.kinglloy.com/ MENU Android动态壁纸解析 24 JULY 2017 阅读之前 建议下载使用Style动态壁纸应用 文章后 ...
- Live Wallpaper动态壁纸开发
Live Wallpaper动态壁纸开发 作者: Android开发网原创 时间: 2011-04-12 对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面 ...
- 制作android动态壁纸,如何使用LibGDx制作Android动态壁纸?
我想制作 Android动态壁纸.我想使用LibGDx.我发现了这个信息: http://www.badlogicgames.com/wordpress/?p=2652 不幸的是,我的壁纸复制代码,e ...
- Android 动态壁纸引擎试刀学习(初识安卓引擎)
动态壁纸蛮好玩的,也没接触过,看官方有就拿了学习下,是小马第一次接触引擎Engine,激动兴奋...效果做出来了,就放博客里,记录笔记,吼吼,跟大家交流学习, 废话不多说了,先看效果,再看源码,之后小 ...
- android水波效果,android动态壁纸中的水波纹效果
[实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...
最新文章
- simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
- 将新建“Typora File”添加到鼠标右键
- Boost:构造一个流对象,任何发送到此流将标准输出
- 有效使用Eclipse的热门提示
- Fragment懒加载(三)
- 在Mac中如何通过命令对NTFS磁盘格式化
- 读书笔记----10日摘抄整理(11)
- java实验报告遇到的问题,JAVA实验报告_doc
- 暴雪:星际2仍在审批 筹划中国电竞联赛
- proteus中的标签及总线的使用方法
- JavaScript学习手册十一:JSON
- 台式计算机怎样时间同步,电脑时间同步,详细教您怎么让电脑时间和网络时间同步...
- vijos 1004 伊甸园日历游戏 博弈+打表找规律
- 2020牛客暑期多校训练营(第九场)	Groundhog and 2-Power Representation
- 中国体育明星商业价值综合指数孙杨、苏炳添、武大靖列前三位
- VBA:完美解决数独问题----全网最强
- 对异地工作的一些看法
- OpenCL编程初探
- Visual Studio 2013 不小心关掉“解决方案资源管理器”怎么办?
- 移动端 简易的table表格