亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

2011.09.21——— android 動態(tài)壁紙開發(fā)

系統(tǒng) 2198 0
2011.09.21——— android 動態(tài)壁紙開發(fā)
參考: http://www.ophonesdn.com/article/show/278
resources/articles/live-wallpapers.html

自己做了一個非常簡單的 只是想了解過程 源碼見附件 步驟如下:

1、新建一個Android工程? 然后進(jìn)入工程的/res/文件夾,刪除layout這個文件夾,當(dāng)然里面的main.xml也會被刪除的,對于Live Wallpaper來說傳統(tǒng)的布局文件是不需要的。

2、在res下面新建一個xml文件夾 然后新建一個mylivewallpaper.xml 內(nèi)容如下:

    <?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
	android:thumbnail="@drawable/icon"
/>
  


這里的android:thumbnail值得是你這個動態(tài)壁紙的小圖標(biāo) 會在你選著動態(tài)壁紙的時候出現(xiàn) 如下圖:

2011.09.21——— android 動態(tài)壁紙開發(fā)

這個可以自己選一個好看一點(diǎn)的

3、開始編寫代碼了? 直接看吧

    
package com.lp.wallpaper;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class MyWallpaper extends WallpaperService{
	private Handler handler = new Handler();
	
	
	
	@Override
	public void onCreate() {
		System.out.println("service onCreate");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		System.out.println("service onDestory");
		super.onDestroy();
	}

	@Override
	public Engine onCreateEngine() {
		System.out.println("service onCreateEngine");
		return new MyEngine();
	}
	
	private class MyEngine extends Engine{
		
		private float x = 200;
		private float y = 300;
		private Paint mPaint;
		private boolean mVisible = false;
		
		private Runnable drawThread = new Runnable() {
			public void run() {
				drawWallpaper();
			}
		};
		
		public MyEngine(){
			System.out.println("MyEngine");
			mPaint = new Paint();
			mPaint.setColor(Color.RED);
			mPaint.setAntiAlias(true);
			mPaint.setStrokeWidth(4);
			mPaint.setStyle(Paint.Style.STROKE);
			mPaint.setTextSize(24);
		}

		@Override
		public Bundle onCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested) {
			// TODO Auto-generated method stub
			System.out.println("onCommand");
			return super.onCommand(action, x, y, z, extras, resultRequested);
		}

		@Override
		public void onCreate(SurfaceHolder surfaceHolder) {
			System.out.println("onCreate");
			super.onCreate(surfaceHolder);
			//作用是使壁紙能響應(yīng)touch event,默認(rèn)是false
			setTouchEventsEnabled(true);
		}

		@Override
		public void onDestroy() {
			System.out.println("onDestroy");
			super.onDestroy();
			handler.removeCallbacks(drawThread);
		}

		@Override
		public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
			// TODO Auto-generated method stub
			System.out.println("onoffsetsChanged");
			super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
		}
		
		@Override
        public void onVisibilityChanged(boolean visible) {
			System.out.println("onVisibilityChanged");
            mVisible = visible;
            if (visible) {
            	//開始
    			handler.postDelayed(drawThread, 50);
            } else {
                handler.removeCallbacks(drawThread);
            }
        }

		@Override
		public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			System.out.println("onSurfaceChanged");
			// TODO Auto-generated method stub
			super.onSurfaceChanged(holder, format, width, height);
		}

		@Override
		public void onSurfaceCreated(SurfaceHolder holder) {
			System.out.println("onSurfaceCreated");
			super.onSurfaceCreated(holder);
		}

		@Override
		public void onSurfaceDestroyed(SurfaceHolder holder) {
			System.out.println("onSurfaceDestoryed");
			// TODO Auto-generated method stub
			super.onSurfaceDestroyed(holder);
			handler.removeCallbacks(drawThread);
		}

		@Override
		public void onTouchEvent(MotionEvent event) {
			System.out.println("onTouchEvent");
			// TODO Auto-generated method stub
			super.onTouchEvent(event);
		}
		
		
		private void drawWallpaper() {
			
			SurfaceHolder holder = getSurfaceHolder();
			Canvas canvas = holder.lockCanvas();
			drawTime(canvas);
			holder.unlockCanvasAndPost(canvas);
			
			//循環(huán)執(zhí)行
			handler.postDelayed(drawThread, 50);
		}

		private void drawTime(Canvas canvas) {
			Date date = new Date(System.currentTimeMillis());
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			String dataStr = sdf.format(date);
			canvas.save();
			canvas.drawColor(0xff00ff00);
			canvas.drawText(dataStr, x, y, mPaint);
			canvas.restore();
		}
	}

}

  


實(shí)現(xiàn)的效果是一個動態(tài)改變的時間 如下圖:

2011.09.21——— android 動態(tài)壁紙開發(fā)

我們一一來解釋:
onCreateEngine() :

啟動一個WallpaperService.Engine 這個engine才是負(fù)責(zé)繪制壁紙以及響應(yīng)與用戶交互事件的核心部件 這個方法也是必須要重寫的 并且是WallpaperService和service的主要區(qū)別

onOffsetsChanged():

這個一般在幾個屏幕滑動的時候調(diào)用 而且 當(dāng)你拖動A屏幕向B屏幕過度時 會隨著B屏幕的顯示面積的變大或者變小一直調(diào)用這個方法

onVisibilityChanged()

這個是屏幕顯示或者不顯示的時候調(diào)用的 必須完全覆蓋屏幕才會調(diào)用

onCommand()

可以給壁紙發(fā)送一些命令 讓其執(zhí)行

onTouchEvent()
處理壁紙的點(diǎn)擊時間的

setTouchEventsEnabled(true)

作用是使壁紙能響應(yīng)touch event,默認(rèn)是false

其他的看名字應(yīng)該就知道了 呵呵

這里也說下Engine的慣用寫法吧

    private class MyEngine extends Engine{
		//這里定義一個線程
		private Runnable drawThread = new Runnable() {
			public void run() {
				drawWallpaper();
			}
		};
		//構(gòu)造方法里面 一般初始化Paint對象
		public MyEngine(){
			System.out.println("MyEngine");
			mPaint = new Paint();
			mPaint.setColor(Color.RED);
			mPaint.setAntiAlias(true);
			mPaint.setStrokeWidth(4);
			mPaint.setStyle(Paint.Style.STROKE);
			mPaint.setTextSize(24);
		}

                //這里 調(diào)用setTouchEventsEnabled(true);即可
		@Override
		public void onCreate(SurfaceHolder surfaceHolder) {
			System.out.println("onCreate");
			super.onCreate(surfaceHolder);
			//作用是使壁紙能響應(yīng)touch event,默認(rèn)是false
			setTouchEventsEnabled(true);
		}
                //取消callback
		@Override
		public void onDestroy() {
			System.out.println("onDestroy");
			super.onDestroy();
			handler.removeCallbacks(drawThread);
		}
                //當(dāng)顯示的時候 綁定callback 不顯示時  取消callback		
		@Override
        public void onVisibilityChanged(boolean visible) {
			System.out.println("onVisibilityChanged");
            mVisible = visible;
            if (visible) {
            	//開始
    			handler.postDelayed(drawThread, 50);
            } else {
                handler.removeCallbacks(drawThread);
            }
        }

		@Override
		public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			System.out.println("onSurfaceChanged");
			// TODO Auto-generated method stub
			super.onSurfaceChanged(holder, format, width, height);
		}

		@Override
		public void onSurfaceCreated(SurfaceHolder holder) {
			System.out.println("onSurfaceCreated");
			super.onSurfaceCreated(holder);
		}
                 //取消callback
		@Override
		public void onSurfaceDestroyed(SurfaceHolder holder) {
			System.out.println("onSurfaceDestoryed");
			// TODO Auto-generated method stub
			super.onSurfaceDestroyed(holder);
			handler.removeCallbacks(drawThread);
		}
                //處理點(diǎn)擊事件 比如說 點(diǎn)擊時 出現(xiàn)水波等
		@Override
		public void onTouchEvent(MotionEvent event) {
			System.out.println("onTouchEvent");
			// TODO Auto-generated method stub
			super.onTouchEvent(event);
		}
		
		//得到surfaceholder和canvas 并調(diào)用核心處理方法
		private void drawWallpaper() {
			
			SurfaceHolder holder = getSurfaceHolder();
			Canvas canvas = holder.lockCanvas();
			drawTime(canvas);
			holder.unlockCanvasAndPost(canvas);
			
			//循環(huán)執(zhí)行
			handler.postDelayed(drawThread, 50);
		}
                //核心處理方法
		private void drawTime(Canvas canvas) {
			
		}
	}
  


4、在AndroidManifes.xml里面注冊service

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.lp.wallpaper">
    <uses-sdk android:minSdkVersion="7" />
    <uses-feature android:name="android.software.live_wallpaper" />

    <application 
	    android:icon="@drawable/icon" 
	    android:label="@string/app_name">
    
		<service 
			android:label="@string/app_name"
			android:name=".MyWallpaper"
			android:permission="android.permission.BIND_WALLPAPER">
			<intent-filter>
				<action android:name="android.service.wallpaper.WallpaperService" />  
			</intent-filter>
			<meta-data android:name="android.service.wallpaper" android:resource="@xml/mylivewallpaper" />	
		</service>

    </application>
</manifest>
  


除了
    android:resource="@xml/mylivewallpaper"
  
是可以自己修改 其他的都是必須得 特別強(qiáng)調(diào)幾個:
    <uses-sdk android:minSdkVersion="7" />
<uses-feature android:name="android.software.live_wallpaper" />
android:permission="android.permission.BIND_WALLPAPER"
  


5、自己的一些關(guān)于方法執(zhí)行順序的測試信息:
當(dāng)進(jìn)入改壁紙的設(shè)置頁面 但是還沒有設(shè)置時
09-21 07:55:05.575: INFO/System.out(1337): service onCreate
09-21 07:55:05.614: INFO/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): onVisibilityChanged

當(dāng)點(diǎn)擊設(shè)置壁紙按鈕后
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
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-21 07:55:21.305: INFO/System.out(1337): onSurfaceDestoryed
09-21 07:55:21.333: INFO/System.out(1337): onDestroy

在壁紙上面點(diǎn)擊
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: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

設(shè)置其他壁紙 代替自己的壁紙
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.953: INFO/System.out(1337): service onDestory


另:Engine的生命周期:

2011.09.21——— android 動態(tài)壁紙開發(fā)



2011.09.21——— android 動態(tài)壁紙開發(fā)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产产一区二区三区久久毛片国语 | 成人国产片免费 | 中文字幕在线最新在线不卡 | 99视频网| 欧美肥婆xxxx欧美另类 | 中文字幕在线日本 | 亚洲国产成人精品女人久久久 | 毛片毛片毛片毛片毛片 | 91在线精品视频 | 快射影院| 夜夜夜夜操 | 理论片黄色| 一级毛片不卡免费看老司机 | 在线观看男女爱视频网站 | 国产精品资源在线 | 国产久7精品视频 | 九九久久久久午夜精选 | 国产精品网址你懂的 | 婷婷激情视频 | 不卡国产视频 | 毛茸茸性毛茸茸大b | 欧美性猛交99久久久久99 | 久久婷婷久久一区二区三区 | 成人影院在线免费观看 | 亚洲欧洲日韩国产一区二区三区 | 色偷偷88888欧美精品久久久 | 成年女人视频免费观看一 | 国产精品久久久久久久久99热 | 日本精品久久久久久久 | 欧美一区二区三区东南亚 | 欧美美妇性较大毛片 | 国产丰满老厨女房乱 | 久久精品这里是免费国产 | 久久精品国产99久久6动漫欧 | 久久亚洲国产成人精品性色 | 久久a视频| 性做久久久久久免费观看 | 免费香蕉视频 | 国产伦理一区二区三区 | 亚洲精品国产福利在线观看 | 亚洲国产成人超福利久久精品 |