android 动态壁纸 例子,android 动态壁纸实例(1)【转】
隨著三星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:
encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.oms.LiveWall"
android:versionCode="1"
android:versionName="1.0">
android:icon="@drawable/icon"
android:label="@string/app_name">
android:label="@string/app_name"
android:name=".TimeWall"
android:permission="android.permission.BIND_WALLPAPER">
android:name="android.service.wallpaper.WallpaperService"
/>
android:name="android.service.wallpaper"
android:resource="@xml/alive_wall"
/>
android:minSdkVersion="7"
/>
原來如此簡單,動態壁紙僅僅有一個service就夠了。其中
android:permission="android.permission.BIND_WALLPAPER"
是讓該service有能設置為壁紙的權限,沒有的話該壁紙只能被預覽。
告訴我們,如果你想開發一個live wallpaper,必須是OPhone
2.0或者更高的版本。當然這也需要手機硬件的支持。
2、怎樣實現WallpaperService?
WallpaperService與其他的service唯一的不同就是,你必須要增加一個方法onCreateEngine(),它會返回一個WallpaperService.Engine,這個engine才是負責繪制壁紙以及響應與用戶交互事件的核心部件。這個service代碼結構如下:
public class TimeWall extends WallpaperService {
public Engine onCreateEngine() {
return new TimeEngine();
}
public class TimeEngine extends Engine {
// ...more code
}
}
類TimeEngine才是處理壁紙的核心類,我們會在類TimeEngine中加上自己的邏輯以完成壁紙的繪制、變化以及銷毀。Engine的生命周期與大多數OPhone應用程序組件,比如activity類似,都是從onCreate()開始,在銷毀時調用onDestory()方法。不同的是WallpaperService會提供一個surface用來繪制壁紙,所以在生命周期中多一個onSurfaceCreated與onSurfaceDestroyed的過程。下面是一個最簡生命周期:
也就是說只要我們實現上面四個方法,一個基本的LiveWallpaper就可以完成了。讓我們逐個看一下這幾個方法的實現。
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
setTouchEventsEnabled(true);
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeMessages(DRAW);
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
mHandler.sendEmptyMessage(DRAW);
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder)
{
super.onSurfaceDestroyed(holder);
mHandler.removeMessages(DRAW);
}
在onCreate方法里,我們
setTouchEventsEnabled(true);
作用是使壁紙能響應touch
event,默認是false。TimeWall會在用戶點擊屏幕的時候畫一個十字架,所以我們需要設置其為true。
可以看到我們在這四個方法里面做的事情非常簡單,就是在create時候發一個message,執行畫面的繪制,在destory時remove這個消息。看一下mHandler的代碼:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case DRAW:
drawWall();
break;
}
}
};
方法drawWall():
private void drawWall() {
SurfaceHolder holder =
getSurfaceHolder();
Canvas canvas =
holder.lockCanvas();
drawTime(canvas);
drawCross(canvas);
holder.unlockCanvasAndPost(canvas);
mHandler.removeMessages(DRAW);
mHandler.sendEmptyMessageDelayed(DRAW,
50);
}
總結
以上是生活随笔為你收集整理的android 动态壁纸 例子,android 动态壁纸实例(1)【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LinuxC高级编程——线程
- 下一篇: redis分布式锁java代码_基于re