日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LiveWallPaper 动态壁纸程序开发【转】

發布時間:2024/3/26 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LiveWallPaper 动态壁纸程序开发【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????通常手機屏幕的壁紙就是一張靜態的圖片,看上去已經挺不錯的了,但它不會有變化。

?

????? LiveWallPaper?動態壁紙是從Android2.1就開始帶有的一個新的特性。它讓我們能夠將本來毫無生氣的靜態的手機屏幕背景替換成 從 隨著音樂的活力和脈動而跳躍的聲線 到 手指撫過能激起陣陣漣漪的靜默的池塘。顯示當前天氣情況、展示幻燈片甚至是表現煙火特效也只是android百變動態壁紙的冰山一角。現在讓我們揭開它神秘的面紗。看看這些神奇的應用是如何做到的。

??

????????????????????????????????????????????????????????????????????????????? 圖一

????????????????????????創建我們的CS——LiveWallpaper項目

? 在這個例子中,我們將創造一個活生生的墻紙,使用OpenGL顯示一個旋轉的立方體。最后的程序運行結果就如圖一所示。首先創建一個新的android項目,在其的向導wizard中使用這些值:

Project? name:??CS_Livewallpaper
Build? Target:? Android? 2.2
Application? name:? Wallpaper
Package? name:? classroom.studio
Min? SDK? Version:? 8

??? Activity的名字可以先空著。關閉Activity項左邊的復選框。如下圖二所示。

??????????????????????????????????????????????????????????????????????????????????圖二

?? 創建項目后,我們需要為新項目中的androidmanifest.xml文件中添加新的屬性。它看起來就像下面這樣。

?

1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="classroom.studio" 3 android:versionCode="1" 4 android:versionName="1.0"> 5 <application android:label="@string/app_name"> 6 <service android:name=".Wallpaper" 7 android:label="@string/service_name" 8 android:permission="android.permission.BIND_WALLPAPER"> 9 <intent-filter> 10 <action android:name= 11 "android.service.wallpaper.WallpaperService" /> 12 </intent-filter> 13 <meta-data android:name="android.service.wallpaper" 14 android:resource="@xml/wallpaper" /> 15 </service> 16 </application> 17 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 18 </manifest> 19

?

???? <service>這個標簽是新的。它定義了一個,將運行在背景上并且對事件有響應的Android服務。?android:permission= attribute的意思是任何程序調用我們的服務都需要有一個指定的權限。?Android的Home程序已經具備了該權限,所以它會工作得很好。

?

??????< intent-?lter >這個標簽告訴Android它是個什么樣的服務,并且< meta-data >標簽讓它知道在哪能找到關于wallpaper的額外信息。?android:resource被設為"@xml/wallpaper"這個值最好改成res/xml/wallpaper.xml 文件。以下便是該xml文件的內容。

?

?

1 <?xml version="1.0" encoding="utf-8"?> 2 <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" 3 android:author="@+string/author" 4 android:description="@string/description" 5 android:thumbnail="@drawable/thumbnail" 6 />

?

???這個 wallpaper的metadata(元數據)指定了這個程序的作者的名字、該程序的介紹以及一個縮略圖。所有這些分別存儲在string.xml以及drawable文件中。他們將在使用者選擇該使用哪個動態壁紙應用的時候以列表的形式顯示出來。因此我們還需要創建一個string.xml文件。如下所示。?

?

string.xml

?? 我們可以AVD中看到這個文件實際所起的作用。如下圖三所示

?????????????????????????????????????

????????????????????????????????????????????????????????????????? 圖三

?

??同時我們也需要刪除掉一個Layout中的文件 res/layout/main.xml。因為我們不會在這個程序中使用它。在我們具體了解了Android的一些服務之后我們將填寫Wallpaper類。?

?

?

?? 書接前文,我們先要介紹Android的services。Android的一個與眾不同的特征就是具有可在背景中運行程序的能力。為了將他們與前景的activities分開,Android把這些程序叫做services。

?

?? Service類由一個service的main java類繼承.Services像 activities一樣 也有個生命周期,但較之要簡單得多。?在這個周期中,當我們第一次創建service類時, 需要調用onCreate()的方法。而當我們消除該service時,則調用了onDestroy()方法。

?

?? 而在這兩者之間,當客戶發出開始service的請求時,Android將調用 onStartCommand()方法 。當然Android也為我們提供一些其他的方法以備不時需,例如在內存低情況下使用的onLowMemory()方法,以及下表一所示。?

????????????????????????????????????????????????????????????????????????????????????????表一

公開的部分的方法
void??????????onRebind(Intent?intent) 如果之前通過onUnbind(Intent)方法已經通告解除所有聯系后, 當新的clients再與service取得聯系時,該方法被調用。
BooleanonUnbind(Intent?intent) 當所用Clients都已與一個service發出的特點界面斷開聯系時,調用該方法。
final voidstopSelf() 如果之前它開始過,則自己停止該service。
final void????????? ?startForeground(int id,?Notification?notification) 該方法使該service能夠運行在前臺(前景上), 并在這個狀態下支持將ongoing的通知顯示給用戶。
final voidstopForeground(boolean removeNotification) 從前景中去除該service,并允許在內存低時殺死service。
想了解更多方法請參考:?http://d.android.com/reference/android/app/Service.html


??
?當然在我們這個例子中,不需要關心這些方法,因為他們都將由Service的子類WallpaperService 來處理。

???我們的main類需要擴展成Wallpaper,就像下面這樣。

1 package classroom。studio; 2 ?import android.service.wallpaper.WallpaperService; 3 ?public class Wallpaper extends WallpaperService { 4 ?private class MyEngine extends Engine { 5 ?// 從這里實現引擎。。。 6 ?} 7 @Override 8 ?public Engine onCreateEngine() { 9 ?return new MyEngine(); 10 } 11 } 12 ?

?

???我們現在要做的就是實現只有一行代碼的onCreateEngine()方法。它的唯一目的就是要創建并返回另一個叫做MyEngine的類。

?

????????????構建一個繪圖引擎

?????因為這個MyEngine一定要是Wallpaper里的一個類,所以在類的封閉的大括號中聲明了它。MyEngine 擴展了由Android提供的Engine類。以下的代碼是帶有所有要用到的方法的MyEngine 綱要。

?

wallpaper.java 1 private class MyEngine extends Engine { 2 @Override 3 ?public void onCreate(final SurfaceHolder holder) { 4 ?super.onCreate(holder); 5 } 6 @Override 7 ?public void onDestroy() { 8 ?super.onDestroy(); 9 }; 10 @Override 11 ?public void onSurfaceCreated(final SurfaceHolder holder) { 12 ?super.onSurfaceCreated(holder); 13 } 14 @Override 15 ?public void onSurfaceDestroyed(final SurfaceHolder holder) { 16 ?super.onSurfaceDestroyed(holder); 17 }@Override 18 ?public void onSurfaceChanged(final SurfaceHolder holder, 19 final int format, final int width, final int height) { 20 super.onSurfaceChanged(holder, format, width, height); 21 } 22 @Override 23 public void onVisibilityChanged(final boolean visible) { 24 super.onVisibilityChanged(visible); 25 } 26 @Override 27 public void onOffsetsChanged(final float xOffset, 28 final float yOffset, final float xOffsetStep, 29 final float yOffsetStep, final int xPixelOffset, 30 final int yPixelOffset) { 31 super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, 32 yOffsetStep, xPixelOffset, yPixelOffset); 33 } 34 }

?

?? 需要注意的是每個方法應該總是調用其基類方法。

?? 在Engine的整個生命周期中,Android會在特定的命令下調用這些方法。下面就是整個句子。

onCreate
???? onSurfaceCreated
????????????????? onSurfaceChanged (1+ calls in any order)
????????????????? onOffsetsChanged (0+ calls in any order)
????????????????? onVisibilityChanged (0+ calls in any order)
???? onSurfaceDestroyed
onDestroy

??接下來,我們將填寫這些方法。不過我們還需要幾個聲明來防止編譯出錯,當我們編寫代碼時我們可以讓Eclipse幫我們來創建這些語句(使用 Content Assist(Ctrl+空格)或是 Quick Fix(Ctrl+1) 亦或是通過Source > Organize Imports command ( Ctrl+Shift+O )實現批處理。但如果您愿意的話,也可以自己敲,下面是完整的列表。

?

1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import javax.microedition.khronos.egl.EGL10; 4 import javax.microedition.khronos.egl.EGL11; 5 import javax.microedition.khronos.egl.EGLConfig; 6 import javax.microedition.khronos.egl.EGLContext; 7 import javax.microedition.khronos.egl.EGLDisplay; 8 import javax.microedition.khronos.egl.EGLSurface; 9 import javax.microedition.khronos.opengles.GL10; 10 import android.service.wallpaper.WallpaperService; 11 import android.view.SurfaceHolder;

?

??下面讓我們開始畫我們的立方體吧。初始效果如圖四所示。OpenGL ES

?

?

????????????????????????????????????????????????圖四

?

?

?

先要了解一下何為OpenGL 以及OpenGL ES。

?

???OpenGL的前世今生

?

????1992年Silicon Graphics 開發出了OpenGL。它從此開始為程序員提供一個統一的平臺讓他們能夠駕馭來自不同生產商的硬件。它的核心,OpenGL迎合了三維圖形開發的一些經典概念如viewpoints和lighting并試圖讓開發者可以基本不去考慮錯綜復雜的硬件層就能實現3D的效果。您可以瀏覽http://www.opengl.org了解OpenGL的更多內容。

??? 不過正是因為當初它是為工作站設計的,所以OpenGL對于一部手機來說實在是太大了。所以Google Android采用了OpenGL的一個子集——(OpenGL for Embedded Systems 針對嵌入式系統的OpenGL 簡稱OpenGL ES)。這個標準是由Intel、AMD、Nividia、Nokia、SONY、三星等行業巨頭共同支持的 Khronos Group行業協會提出來的,包括Android、塞班和Iphone在內的主要手機平臺都采用了這個庫。雖然他們彼此之間還是有著細微的差別。您可以瀏覽http://www.khronos.org/opengles了解OpenGL ES的更多內容。

??? 幾乎每種計算機語言都有他自己與OpenGL ES相綁定的部分。當然JAVA也不例外。在JAVA Specification Request(JSR)239中定義了這部分綁定。

?

????Android的OpenGL ES

?

??? OpenGL ES 1.0 基于完整的OpenGL 1.3,而 ES 1.1 基于 OpenGL 1.5。JSR 239 有兩個版本:一個原有的1.0 和正式的1.0.1。而我們這次使用的便是OpenGL ES1.1

??? 不過從Android2.2開始,OpenGL ES 2.0開始通過android.opengl 包得到支持。您也可以通過NDK來調用它。OpenGL ES 2.0? 。不過還沒有對應于OpenGL ES 2.0的JSR標準。如下圖五所示

??

?????????????????????????????????????????????????????圖五

?

????現在讓我們用OpenGL ES來建立我們自己的立方體模型吧。?

?

更新

總結

以上是生活随笔為你收集整理的LiveWallPaper 动态壁纸程序开发【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。