`

动态壁纸探究[转]

阅读更多

转自http://www.ophonesdn.com/article/show/278;jsessionid=47A3929593AFBB3038786C575833DD49

 

随着三星Oscar的上市,流畅的操作,华丽的界面,OPhone 2.0的不俗表现不禁让人眼前一亮。作为OPhone 2.0一个新特性,动态壁纸(Live Wallpapers)为用户带来了更炫体验。本文主要通过一个完整的时间壁纸(TimeWall)为大家介绍如何开发 Live Wallpapers。还没开发环境?赶紧去下载OPhone SDK 2.0吧!

 
1、 Live Wallpapers是什么?
     oscar上有一个动态壁纸叫“天空草地”,用过一段时间,可以发现,随着时间的变化,壁纸的天空就会由蓝蓝青天变成繁星满天。看看效果:
 
    为什么壁纸还有这么神奇的变化,这中间到底是什么在起作用?其实,一个Live Wallpaper就是一个apk!也就是说,动态壁纸的实质是一个apk在后台不断地重绘壁纸,所以我们可以让小草长高,小鸟飞翔。
   
     来看一下我们TimeWall的AndoridManifest.xml:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.oms.LiveWall" android:versionCode="1"  
  4.     android:versionName="1.0">  
  5.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  6.         <service android:label="@string/app_name" android:name=".TimeWall"  
  7.             android:permission="android.permission.BIND_WALLPAPER">  
  8.             <intent-filter>  
  9.                 <action android:name="android.service.wallpaper.WallpaperService" />  
  10.             </intent-filter>  
  11.             <meta-data android:name="android.service.wallpaper"  
  12.                 android:resource="@xml/alive_wall" />  
  13.         </service>  
  14.     </application>  
  15.     <uses-sdk android:minSdkVersion="7" />  
  16. </manifest>  
 
    原来如此简单,动态壁纸仅仅有一个service就够了。其中
android:permission="android.permission.BIND_WALLPAPER"
 
      是让该service有能设置为壁纸的权限,没有的话该壁纸只能被预览。
    <uses-sdk android:minSdkVersion="7" />
 
      告诉我们,如果你想开发一个live wallpaper,必须是OPhone 2.0或者更高的版本。当然这也需要手机硬件的支持。
 
2、怎样实现WallpaperService?
    WallpaperService与其他的service唯一的不同就是,你必须要增加一个方法onCreateEngine(),它会返回一个WallpaperService.Engine,这个engine才是负责绘制壁纸以及响应与用户交互事件的核心部件。这个service代码结构如下:
  1. public class TimeWall extends WallpaperService {  
  2.    
  3.     public Engine onCreateEngine() {  
  4.         return new TimeEngine();  
  5.     }  
  6.    
  7.     public class TimeEngine extends Engine {  
  8.         // ...more code  
  9.     }  
  10. }  
 
    类TimeEngine才是处理壁纸的核心类,我们会在类TimeEngine中加上自己的逻辑以完成壁纸的绘制、变化以及销毁。Engine的生命周期与大多数OPhone应用程序组件,比如activity类似,都是从onCreate()开始,在销毁时调用onDestory()方法。不同的是WallpaperService会提供一个surface用来绘制壁纸,所以在生命周期中多一个onSurfaceCreated与onSurfaceDestroyed的过程。下面是一个最简生命周期:
 
    也就是说只要我们实现上面四个方法,一个基本的LiveWallpaper就可以完成了。让我们逐个看一下这几个方法的实现。
  1. @Override  
  2. public void onCreate(SurfaceHolder surfaceHolder) {  
  3.     super.onCreate(surfaceHolder);  
  4.     setTouchEventsEnabled(true);  
  5. }  
  6.   
  7. @Override  
  8. public void onDestroy() {  
  9.     super.onDestroy();  
  10.     mHandler.removeMessages(DRAW);  
  11. }  
  12.   
  13. @Override  
  14. public void onSurfaceCreated(SurfaceHolder holder) {  
  15.     super.onSurfaceCreated(holder);  
  16.     mHandler.sendEmptyMessage(DRAW);  
  17. }  
  18.   
  19. @Override  
  20. public void onSurfaceDestroyed(SurfaceHolder holder) {  
  21.     super.onSurfaceDestroyed(holder);  
  22.     mHandler.removeMessages(DRAW);  
  23. }  
 
    onCreate方法里,我们
setTouchEventsEnabled(true);
 
         作用是使壁纸能响应touch event,默认是false。TimeWall会在用户点击屏幕的时候画一个十字架,所以我们需要设置其为true。
 
    可以看到我们在这四个方法里面做的事情非常简单,就是在create时候发一个message,执行画面的绘制,在destory时remove这个消息。看一下mHandler的代码:
  
  1. private Handler mHandler = new Handler() {  
  2.       public void handleMessage(Message msg) {  
  3.           switch (msg.what) {  
  4.           case DRAW:  
  5.               drawWall();  
  6.               break;  
  7.           }  
  8.       }  
  9.   };  
  方法drawWall():
        
  1. private void drawWall() {  
  2.             SurfaceHolder holder = getSurfaceHolder();  
  3.             Canvas canvas = holder.lockCanvas();  
  4.             drawTime(canvas);  
  5.             drawCross(canvas);  
  6.             holder.unlockCanvasAndPost(canvas);  
  7.    
  8.             mHandler.removeMessages(DRAW);  
  9.             mHandler.sendEmptyMessageDelayed(DRAW, 50);  
  10.         }  
 
    从上面可以看出,动态壁纸实际上就是不断刷新的静态壁纸,越华丽越流畅,CPU就消耗越大,对于现在的本来电量就不怎么地的智能机来说,耗电也是很可观的。但是偶尔向朋友们炫一下还是绝对可行的。drawTime()与drawCross()的内容可以由家自己实现,在
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics