《《Android动态壁纸》PPT课件.pptx》由会员分享,可在线阅读,更多相关《《Android动态壁纸》PPT课件.pptx(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Android 动态壁纸wallpaper动态壁纸实现原理 1 使用RenderScript框架,继承WallpaperService,并实现一个引擎 绘制动态壁纸 2 注册一个service附带权限:android:permission=android.permission.BIND_WALLPAPER“动态壁纸的本质是什么android动态壁纸并不是png图片,而是一个标准的应用程序,即apk。android动态墙纸的本质是一个“Service”,这个Service能够被主界面Launcher加载。wallpaper动态壁纸代码的位置Android内置的动态墙纸都在packages/wal
2、lpapers/这个目录里。其中,Basic、MusicVisualization两个目录里都包括了多个相同代码框架的多个动态墙纸,MagicSmoke目录只包含魔幻烟雾一个动态墙纸,LivePicker目录里包含的是动态墙纸的选择列表的代码,也就是你在桌面选择添加动态墙纸时出现的系统里所有动态墙纸的那个列表的实现代码。Launcher是如何能识别这个包含动态墙纸Service的APK的呢?不妨看一下MagicSmoke的AndroidManifest.xml文件wallpaper wallpaper分析系统正式通过APK的这个action把其当做一个动态墙纸加载进LivePicker列表,用
3、户在LivePicker列表里选择自己喜欢的动态墙纸,进而将动态墙纸显示进Launcher的背后。需要指出的是,Android的动态墙纸虽然似乎是显示在Launcher的背景里,但其实这只是假象,动态墙纸和Launcher是完全不同的两个进程,只不过Launcher和动态墙纸的进程可以通过框架里WallpaperManager进行进程间通信罢了,用户在Launcher桌面滑动、点击屏幕时有的动态墙纸能产生交互效果,实际上就是这个进程通信完成的。如果你通过代码将Launcher的背景设置为非透明的,比如以不透明的图片或者颜色作为背景,那么,你将看不到任何动态墙纸效果,当然,这样的话,静态墙纸你也
4、不会看到了。wallpaper接上这是让该service有能设置为壁纸的权限,没有的话该壁纸就只能被预览。private void findLiveWallpapers()List list=mPackageManager.queryIntentServices(new Intent(WallpaperService.SERVICE_INTERFACE),PackageManager.GET_META_DATA);.wallpaperlive wallpaper是什么?有一个壁纸叫天空草地,用过一段时间可以发现,随着时间的变化,壁纸的天空就会由蓝蓝青天变成繁天满星。其实,live wallpa
5、per就是一个apk。也就是说,一个apk在后台不断地重绘壁纸,所以我们可以让小草长高,小鸟飞翔。功能看效果图:wallpaperwallpaperwallpaperwallpaperwallpaperwallpaperwallpaper类描述import android.service.wallpaper.IWallpaperConnection;import android.service.wallpaper.IWallpaperEngine;import android.service.wallpaper.WallpaperSettingsActivity;import android.
6、renderscript.RSSurfaceView;import android.renderscript.RenderScriptGL;import android.content.Context;import android.view.SurfaceHolder;Wallpaperservice 与其他service唯一不同的是必须增加一个方onCreateEngine(),它会返回一个Wallpaperservice.Engine,这个engine才是负责绘制壁纸以及响应与用户交互事件的核心部件。这个service结构如下:public abstract class RenderScr
7、iptWallpaper extends WallpaperService public Engine onCreateEngine()return new RenderScriptEngine();private class RenderScriptEngine extends Engine private RenderScriptGL mRs;private T mRenderer;wallpaper其实,RenderScriptEngine类才是真正处理壁纸的核心类,我们会再这个类中完成绘制、变化和销毁。Engine的生命周期和大多数的应用程序组件相同,比如activity,都是从onC
8、reate()开始,在销毁时调用onDestroy()方法。不同的是wallpaperService会提供一个surface来绘制壁纸,所以在它的生命周期中多了一个onSurfaceCreated和onSurfaceDestroyed的过程。最简生命周期是:Wallpaperservice start-onCreate()-onSurfaceCreate()-onSurfaceDestroyed-onDestroy()-wallpaperservice shut down一个基本的live wallpaper就实现了。wallpaper下面逐步分析各个方法:在onCreate()方法里,我们s
9、etTouchEventsEnabled(false),作用是我们能够响应touch event,默认是false。这里RenderScriptWallpaper会根据当前时间判断太阳升起还是太阳落山,重绘背景,所以我们需要设置为false。其次,在onSurfaceChanged()中启动GrassRS。class GrassRS extends RenderScriptScene 在这个类中实现onstart(),首先注册一个BroadcastReceiver,当接收时调整当前时间。所定义了一个SunCalculator类计算时间,相关方法如下:public double computeS
10、unriseTime(double solarZenith,Calendar date)public double computeSunsetTime(double solarZenith,Calendar date)private double computeSolarEventTime(double solarZenith,Calendar date,boolean isSunrise)private double getLocalTime(double localMeanTime,Calendar date)private double adjustForDST(double local
11、MeanTime,Calendar date)wallpaper然后,createScript时绑定相关state,载入一些图片数据loadTexture()。当Launcher滑动桌面,壁纸也要左右移动,实现该方法即可。public void setOffset(float xOffset,float yOffset,int xPixels,int yPixels)相关log介绍:当接收到时,就会执行GrassRS中的stop(),取消注册;点亮屏幕时,即接收到时,就会执行GrassRS中的start()重新注册,执行updateLocation(),记录当前时间并保存。最后实现重绘。依次执
12、行:createProgramVertex();createProgramFragmentStore();loadTextures();createProgramFragment();createScriptStructures();createBlade();createMesh();createState();createScript();start();updateLocation();当进入改壁纸的设置页面 但是还没有设置时 09-21 07:55:05.575:INFO/System.out(1337):service onCreate 09-21 07:55:05.614:INFO
13、/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):on
14、VisibilityChanged 当点击设置壁纸按钮后 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
15、 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-
16、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
17、: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.9
18、53:INFO/System.out(1337):service onDestory小贴士RenderScript学习笔记 它的优点:a.RenderScript是与不同的CPU和GPU架构设计多种类型设备的运行它支持allof这些架构,而无需针对每个设备,因为代码被编译和设备上的高速缓存在运行时。b.RenderScript简化了开发时可能下极限 JNI的胶水代码和简化网 格设置。它的不足:a.RenderScript可能执行(为更高版本的计划功能)比主CPU(如GPU的)的处理器,所以如果发生这种情况,调试变得更加困难。b.RenderScript不提供作为许多功能,如所有的压缩纹理格式或
19、GL扩展asOpenGL。小贴士Android内置的动态墙纸都是基于RenderScript实现的,RenderScript是Google用于Android的一种类C语言,其与C语言语言结构很类似,其对OpenGL的标准API进行了简单的封装,可以在运行时再加载RenderScript文件运行。也就是说,如果你想基于RenderScript开发新的动态墙纸,你应该对OpenGL的常用API有一定的了解。此外,Google目前对RenderScript的开发资料还不是很完善,在公开发布的SDK里也暂时没有把RenderScript继承进ADT,换言之,如果你想用RenderScript开发新动态墙纸,你不能基于ADT和SDK在Eclipse下进行开发,而应该下载完整源代码并编译整个框架,然后在自己的Linux编译环境里去写新应用。因为RenderScript是要调用OpenGL接口的,你开发的应用要能在真机上运行起来,你的机子必须支持3D,也就是OpenGL。如果你发现有的厂商的手机桌面并没有加载动态墙纸的入口,那么不用多说,那一定是该手机根本不支持3D。Q&Athanks
限制150内