android動態桌布1——初步框架(有背景,能使用,仿可愛寶貝)
一、簡介:
正如別人所說的一樣:動態桌布是一個Android應用程式,包括一個服務(WallpaperService)。該服務必須包括一個引擎(WallpaperService.Engine)。該引擎是連線使用者、桌面、系統之間的橋樑。它也可以繪製桌面桌布。動態桌布是一個apk應用,但是不同的是這個在我們實現的時候可以不用activity
二、許可權與宣告:
在AndroidManifest.xml中新增許可權android:permission=
"android.permission.BIND_WALLPAPER",否則該桌布只能預覽,不能被實際應用
在AndroidManifest.xml中新增宣告android:name=
"android.service.wallpaper.WallpaperService"以便系統識別(後面程式碼中可見)
三、操作:
1.建立一個android工程(沒有activity和佈局檔案的空工程)——MyWallPaper
2.在src下建立包com.mywallpaper.service,並建立一個服務類-MyWallPaperService
3.在AndroidManifest.xml中配置服務的資訊
其中android:name是你的service的包類路徑;
android:icon是在動畫桌布列表中顯示的圖示(相當於應用列表中的圖示)
android:label:桌布的標籤,相當於一個應用的名稱
android:resource="@xml/mywallpaper"是其資訊,接下來實現。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name="com.mywallpaper.service.MyWallpaperService" android:enabled="true" android:icon="@drawable/icon" android:label="@string/app_name" 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/mywallpaper" /> </service> </application>
4.桌布資訊實現:在res目錄下建立資料夾xml,新增xml檔案mywallpaper.xml如下內容:
其中android:description是描述;後面兩行資訊可以不用
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/icon"
android:description="@string/description"
/>
5.MyWallPaperService的實現:
5.1 繼承WallPaperService並實現其方法
5.2 建立內部類MyEngine並繼承Engine;
5.3 提供初始化圖片的方法
/**
* 初始圖片
*/
public void initImg() {
backgound = BitmapFactory.decodeResource(this.getResources(),
R.drawable.backgound);
}
5.4 提供繪畫的方法
/**
* 繪畫的方法
*/
private void draw(){
SurfaceHolder holder = engine.getSurfaceHolder();
Canvas canvas = holder.lockCanvas(null);
if (canvas != null) {
canvas.drawBitmap(backgound, 0, 0, null);
}
holder.unlockCanvasAndPost(canvas);
}
5.5 engine中建立時初始化圖片
private final Paint paint = new Paint(); // 建立畫筆
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
paint.setAntiAlias(true);// 開啟抗鋸齒
initImg();// 初始化點陣圖資源
}
}
5.6 surface被建立時繪圖
/**
* 該方法是應用程式第一次建立時要呼叫。可在這個方法裡呼叫父類對應方法。
* 該方法執行完畢後系統會立即呼叫onSurfaceChanged方法
*/
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
super.onSurfaceCreated(holder);
draw();
}
6.至此即可執行: