1. 程式人生 > >android動態桌布1——初步框架(有背景,能使用,仿可愛寶貝)

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.至此即可執行: