

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 本科畢業(yè)設(shè)計</b></p><p><b> ?。?0 屆)</b></p><p> 基于andrid平臺opengl圖形圖像接口應(yīng)用研究</p><p> 所在學(xué)院 </p><p> 專業(yè)班級
2、 信息與計算科學(xué) </p><p> 學(xué)生姓名 學(xué)號 </p><p> 指導(dǎo)教師 職稱 </p><p> 完成日期 年 月 </p><p> 【摘要】Android作為Google
3、公司推出的專為智能終端定制的操作系統(tǒng),已經(jīng)成為目前智能手機中增長最快的操作系統(tǒng). 并且必將對手持終端操作系統(tǒng)的發(fā)展產(chǎn)生重要而深遠的影響。OpenGL是目前用于開發(fā)可移植的、可交互的2D和3D圖形應(yīng)用程序的首選環(huán)境,也是目前應(yīng)用最廣泛的計算機圖形標準。本文對android系統(tǒng)的特點平臺如何編寫應(yīng)用軟件做了詳細的介紹,并運用了opengl圖形圖像技術(shù)制作了一個帶有各種圖像特效的手機日歷程序。</p><p> 【
4、關(guān)鍵詞】;android平臺;opengl圖像接口:動畫:智能手機</p><p> 【ABSTRACT】Android as Google company launched which designed for intelligent terminal customization of operating system, has become the fastest growth in the smartph
5、one operating system. And it will produce important and far-reaching effects for the hand-held terminals operating system development . OpenGL is used in development of portable and interactive 2D and 3D graphics applic
6、ations preferred environment at present.It is also the most widely used computer graphics standard. In this paper,it</p><p> 【KEYWORDS】andrid platform;Opengl graphics image interface;animation:。smartphone&
7、lt;/p><p><b> 目 錄</b></p><p> 摘 要(宋體,加粗,小二號字,居中)錯誤!未定義書簽。</p><p> Abstract錯誤!未定義書簽。</p><p> 目 錄(宋體,加粗,小二號字,居中)I</p><p> 1 Android系統(tǒng)簡介1<
8、;/p><p> 1.1 Android來源(宋體四號字加粗)1</p><p> 1.2 Android硬件要求1</p><p> 1.3 Android核心模塊2</p><p> 2 Android與Linux的關(guān)系2</p><p> 2.1 Android與Linux的關(guān)系2</p&g
9、t;<p> 3 Android平臺介紹2</p><p> 3.1 Android系統(tǒng)架構(gòu)2</p><p> 3.2應(yīng)用與框架3</p><p> 4.2.1應(yīng)用程序框架(Application Framework)3</p><p> 4.2.2應(yīng)用程序(Application)3</p>
10、<p> 3.3庫與運行環(huán)境4</p><p><b> 3.4運行環(huán)境4</b></p><p><b> 3.5內(nèi)核5</b></p><p> 4 Android應(yīng)用程序模塊詳解5</p><p><b> 4.1任務(wù)5</b></p
11、><p> 4.2啟動模式以及啟動標記6</p><p><b> 4.3進程6</b></p><p><b> 4.4線程7</b></p><p> 5 android 應(yīng)用程序開發(fā)簡介8</p><p> 5.1 Activity 介紹8&l
12、t;/p><p> 5.1.1 activity的作用8</p><p> 5.1.2 Activity的生命周期8</p><p> 5.2 View簡介以及動畫實現(xiàn)原理10</p><p> 5.2.1 View簡介10</p><p> 5.2.2 動畫的原理以及在android平臺的實現(xiàn)方
13、法11</p><p> 6 Android 日歷應(yīng)用模塊代碼簡介12</p><p> 6.1軟件的需求分析以及功能分析12</p><p> 6.2 各個界面的簡介12</p><p> 6.2.1主界面12</p><p> 6.2.2 編輯界面13</p><p&g
14、t; 6.2.3 刪除消息界面14</p><p> 6.2.4 設(shè)置界面14</p><p> 6.2.5日歷界面15</p><p> 6.3主要功能的實現(xiàn)15</p><p> 6.3.1 日歷部分的數(shù)據(jù)處理功能16</p><p> 6.3.2提醒的保存與讀取19</p>
15、;<p> 6.3.3定時提醒功能的實現(xiàn)21</p><p> 6.4動畫的實現(xiàn)。23</p><p> 1 Android系統(tǒng)簡介</p><p> 1.1 Android來源</p><p> Android一詞的本義指“機器人”,同時也是Google于2007年11月5日宣布的基于Linux平臺的開源手機操作
16、系統(tǒng)的名稱,該平臺由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號稱是首個為移動終端打造的真正開放和完整的移動軟件。</p><p> Android 是由Google與開放手機聯(lián)盟(Open Handset Alliance,OHA)合作開發(fā)的,聯(lián)盟包括Google、HTC(宏達電)、PHILIPS、T-Mobile、高通、魅族、摩托羅拉、三星、LG以及中國移動在內(nèi)的34家企業(yè)。這個聯(lián)盟并不包括把持Symbia
17、n的諾基亞,以及憑借著iPhone風(fēng)光正在的蘋果公司,當然微軟沒有加入,獨樹一幟的加拿大RIM和他們的Blackberry也被擋在門外。</p><p> Android是基于Linux內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機操作系統(tǒng),早期又原名為"Android"的公司開發(fā),谷歌在2005年進行收購"Android.Inc",Google繼續(xù)進
18、行對Android系統(tǒng)開發(fā)運營,它采用了軟件堆層(software stack,又名以軟件疊層)的架構(gòu),主要分為三部分。底層Linux內(nèi)核只提供基本功能;其他的應(yīng)用軟件則由各公司自行開發(fā),部分程序以Java編寫。2011年初數(shù)據(jù)顯示,僅正式推出三年的操作系統(tǒng)Android已經(jīng)超越稱霸十年的塞班系統(tǒng),采用Android系統(tǒng)主要廠商包括美國摩托羅拉(MOTOROLA)、韓國的三星(SAMSUNG)、英國索尼愛立信(Sony Ericsson
19、)另外還有中國廠商如:中國臺灣HTC、聯(lián)想、華為、中興等,使之躍居全球最受歡迎的智能手機平臺,Android系統(tǒng)不但應(yīng)用于智能手機,也在平板電腦市場急速擴張。 </p><p> 1.2 Android硬件要求</p><p> 首先Android作為一個使用Linux內(nèi)核的智能手機操作系統(tǒng)CPU 至少為ARM9 200MHz才能帶動Dalvik這個Java級虛擬機,目前G1使用
20、的是ARM11和ARM9組成的雙核CPU,主頻達到了520MHz。運行內(nèi)存方面Linux雖然有優(yōu)勢,但是Android桌面、UI等都工作在Java VM之上需要的占用十分大,在T-Mobile G1達到了192MB容量,比使用本地C/C++編寫的程序更占用資源,同時Android程序生命周期的特殊性,GC(Garbage Collection)不會頻繁的回收資源,使用的內(nèi)存還是比較大的。</p><p> 在3
21、D硬件加速方面,可以由廠商自己的定制,作為一個可選的組件來支持OpenGL ES,最新已經(jīng)支持到了2.0并非傳統(tǒng)的1.1,廠商還可以定制Wi-Fi網(wǎng)卡、各種感應(yīng)器等硬件。</p><p> 1.3 Android核心模塊</p><p> Android作為一個移動設(shè)備的平臺,其軟件層次結(jié)構(gòu)包括了一個操作系統(tǒng)(OS),中間件(MiddleWare)和應(yīng)用程序(Application)。
22、Android的軟件層次結(jié)構(gòu)自下而上分為以下幾個層次:操作系統(tǒng)層(OS)、各種庫(Libraries)和Android 運行環(huán)境(RunTime)、應(yīng)用程序框架(Application Framework)、應(yīng)用程序(Application)</p><p> 2 Android與Linux的關(guān)系</p><p> 2.1 Android與Linux的關(guān)系</p><
23、;p> Android是在Linux2.6的內(nèi)核基礎(chǔ)之上運行的,提供核心系統(tǒng)服務(wù):安全、內(nèi)存管理、進程管理、網(wǎng)絡(luò)組、驅(qū)動模型。內(nèi)核部分還相當于一個介于硬件層和系統(tǒng)中其他軟件組之間的一個抽象層次。但是嚴格來說它不算是Linux操作系統(tǒng)。</p><p> Android系統(tǒng)的系統(tǒng)層面的底層是Linux,中間加上了一個叫做Dalvik的JAVA虛擬機,表面層上面是Android運行庫。每個Android應(yīng)用
24、都運行在自己的進程上,享有Dalvik虛擬機為它分配的專有實例。為了支持多個虛擬機在同一個設(shè)備上高效運行,Dalvik被改寫過。</p><p> Dalvik虛擬機執(zhí)行的是Dalvik格式的可執(zhí)行文件(.dex)——該格式經(jīng)過優(yōu)化,以降低內(nèi)存耗用到最低。Java編譯器將Java源文件轉(zhuǎn)為class文件,class文件又被內(nèi)置的dx工具轉(zhuǎn)化為dex格式文件,這種文件在Dalvik虛擬機上注冊并運行。</p
25、><p> Android系統(tǒng)的應(yīng)用軟件都是運行在Dalvik之上的JAVA軟件,而Dalvik是運行在Linux中的,在一些底層功能——比如線程和低內(nèi)存管理方面,Dalvik虛擬機是依賴Linux內(nèi)核的。只能說Android是運行在Linux之上的操作系統(tǒng)了,它本身不能算是Linux的某個版本 。</p><p> 3 Android平臺介紹</p><p>
26、3.1 Android系統(tǒng)架構(gòu)</p><p> Android系統(tǒng)架構(gòu)包括::</p><p> 應(yīng)用程序框架(Application framework)——復(fù)用與覆蓋</p><p> Dalvik虛擬機(Dalvik virtual machine)——針對移動設(shè)備的優(yōu)化</p><p> 內(nèi)嵌瀏覽器(Integrated b
27、rowser)——基于開源的webkit引擎</p><p> 優(yōu)化的圖形(Optimized graphics)——2D與3D圖形庫(硬件加速可選)</p><p> SQLite結(jié)構(gòu)化存儲</p><p> 多媒體支持——常用的音頻,視頻和靜止圖像格式(MPEG4,H.264,Mp3,AAC,AMR,JPG,PNG,GIF)</p><
28、p> GSM電話功能——取決于硬件</p><p> 藍牙、EDGE、3G與WiFi功能——取決于硬件</p><p> 相機、GPS、羅盤與加速計功能——取決于硬件</p><p> 豐富的開發(fā)環(huán)境:手機模擬器,調(diào)試工具,內(nèi)存與性能profiling,Eclipse插件</p><p><b> 3.2應(yīng)用與框架&
29、lt;/b></p><p> 4.2.1應(yīng)用程序框架(Application Framework)</p><p> Android 應(yīng)用程序由一個或多個組件組成,Android的應(yīng)用程序框架為應(yīng)用程序?qū)拥拈_發(fā)者提供APIs,它實際上是一個應(yīng)用程序的框架。由于上層的應(yīng)用程序是以JAVA構(gòu)建的,因此本層次提供的首先包含了UI程序中所需要的各種控件:例如: Views (視圖組件)
30、包括 lists(列表), grids(柵格), text boxes(文本框), buttons(按鈕)等。甚至一個嵌入式的Web瀏覽器。 一個Andoid的應(yīng)用程序可以利用應(yīng)用程序框架中的以下幾個部分:</p><p> Activity (活動)</p><p> Broadcast Intent Receiver (廣播意圖接收者)</p><p>
31、; Service (服務(wù))</p><p> Content Provider (內(nèi)容提供者)</p><p> 4.2.2應(yīng)用程序(Application)</p><p> Android的應(yīng)用程序主要是用戶界面(User Interface)方面的,通常以JAVA程序編寫,其中還可以包含各種資源文件(放置在res目錄中)JAVA程序及相關(guān)資源經(jīng)過編譯
32、后,將生成一個APK包。Android本身提供了主屏幕(Home),聯(lián)系人(Contact),電話(Phone),瀏覽器(Browers)等眾多的核心應(yīng)用。同時應(yīng)用程序的開發(fā)者還可以使用應(yīng)用程序框架層的API實現(xiàn)自己的程序。這也是Android開源的巨大潛力的體現(xiàn)。</p><p> 應(yīng)用程序 Android會附帶一些核心的應(yīng)用程序, 包括一個email客戶端, 短信程序, 日歷, 地圖, 瀏覽器, 通訊錄等。
33、</p><p> 所有的應(yīng)用程序都是由Java語言完成的。</p><p> 應(yīng)用程序框架 開發(fā)人員可以跟那些核心應(yīng)用一樣, 擁有訪問框架APIs的全部權(quán)限. 應(yīng)用的系結(jié)構(gòu)設(shè)計簡化了各組件之間的重用;任何應(yīng)用都可以分發(fā)自己的組件, 任何應(yīng)用也可以使用這些分發(fā)的組件(應(yīng)用的使用方法需遵循框架的安全性約束)。這個機制對用戶來說同樣適用, 他們也可以替換組件。</p><
34、;p> 應(yīng)用程序是無界限的,可以再平等條件下創(chuàng)建,還可以輕松地嵌入web,可以并行運行。</p><p><b> 3.3庫與運行環(huán)境</b></p><p> Android 包含一套C/C++庫, 被用于Android 系統(tǒng)中的各種組件中. 這些功能通過Android 應(yīng)用框架展現(xiàn)給開發(fā)人員. 下面列出一些核心:</p><p>
35、; System C library - 實現(xiàn)了BSD-derived 的標準C系統(tǒng)庫(libc), 也是系統(tǒng)中最為底層的庫,用于嵌入式的基于Linux的設(shè)備,C庫是通過Linux的系統(tǒng)調(diào)用來實現(xiàn)的。</p><p> Media Framework - 基于PacketVideo的 OpenCORE; 從功能上該庫一共分為兩大部分,一個部分是音頻,視頻的回放(PlayBack),另一個部分則是音頻,視頻的記
36、錄(Recorder)。同樣包括靜態(tài)圖片文件, 包括MPEG4, H.264, MP3, AAC, AMR, JPG, 和 PNG 等。</p><p> Surface Manager - 用于管理不同應(yīng)用對圖形顯示子系統(tǒng)和2D和3D圖形層的訪問</p><p> WebKit - 一個時尚的web瀏覽器引擎, 為Android瀏覽器和內(nèi)嵌的web view提供實現(xiàn)</p>
37、;<p> SGL - 隱藏的2D圖形引擎</p><p> 3D libraries - 基于OpenGL ES 1.0 APIs實現(xiàn)的庫; 該庫用于3D圖形加速或提供高優(yōu)化的3D軟件光柵器</p><p> FreeType - 位圖和向量模式的字體繪制</p><p> SQLite - 一個強大的, 輕量的關(guān)系型數(shù)據(jù)庫引擎, 用于所有的
38、應(yīng)用Android 運行時 Android包含一組核心庫, 提供了Java語言核心庫內(nèi)的大部分功能.</p><p><b> 3.4運行環(huán)境</b></p><p> Android 運行環(huán)境主要指的虛擬機技術(shù)——Dalvik。Dalvik 虛擬機依賴Linux kernel 來實現(xiàn)一些潛在功能, 例如線程和底層內(nèi)存管理。Dalvik虛擬機和一般JAVA虛擬機(
39、Java VM)不同,它執(zhí)行的不是JAVA標準的字節(jié)碼(bytecode )而是Dalvik可執(zhí)行格式(.dex)中執(zhí)行文件,該格式的文件經(jīng)過優(yōu)化占用很小的內(nèi)存。在執(zhí)行的過程中,每一個應(yīng)用程序即一個進程(Linux的一個Process)。 二者最大的區(qū)別在于Java VM是以基于棧的虛擬機(Stack-based),而Dalvik是基于寄存器的虛擬機(Register-based)。顯然,后者最大的好處在于可以根據(jù)硬件實現(xiàn)更大的優(yōu)化,這
40、更適合移動設(shè)備的特點。每個 Android 應(yīng)用程序都在 Dalvik VM 的一個實例中運行,這個實例駐留在一個由 Linux 內(nèi)核管理的進程中。</p><p><b> 3.5內(nèi)核</b></p><p> Android使用Linux2.6作為操作系統(tǒng),Linux2.6是一種標準的技術(shù),Linux也是一個開放的操作系統(tǒng)。Android對操作系統(tǒng)的使用包括核
41、心和驅(qū)動程序兩部分,Android的Linux核心為標準的Linux2.6內(nèi)核,Android更多的是需要一些與移動設(shè)備相關(guān)的驅(qū)動程序。主要的驅(qū)動如下所示:</p><p> 顯示驅(qū)動(Display Driver):常用基于Linux的幀緩沖(Frame Buffer)驅(qū)動。</p><p> Flash內(nèi)存驅(qū)動(Flash Memory Driver)</p><
42、;p> 照相機驅(qū)動(Camera Driver):常用基于Linux的v4l(Video for )驅(qū)動。</p><p> 音頻驅(qū)動(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高級Linux聲音體系)驅(qū)動。</p><p> WiFi驅(qū)動(Camera Driver):基于IEEE 802.11標準
43、的驅(qū)動程序</p><p> 鍵盤驅(qū)動(KeyBoard Driver)</p><p> 藍牙驅(qū)動(Bluetooth Driver)</p><p> Binder IPC驅(qū)動: Andoid一個特殊的驅(qū)動程序,具有單獨的設(shè)備節(jié)點,提供進程間通訊的功能。</p><p> Power Management(能源管理)</p&
44、gt;<p> 4 Android應(yīng)用程序模塊詳解</p><p><b> 4.1任務(wù)</b></p><p> 當用戶看到的“應(yīng)用”,無論實際是如何處理的,它都是一個任務(wù)。如果你僅僅通過一些活動來創(chuàng)建一個.apk包,其中有一個肯定是上層入口(通過動作的intent-filter 以及分類android.intent.category.LAUNC
45、HER),然后你的.apk包就創(chuàng)建了一個單獨任務(wù),無論你啟動哪個活動都會是這個任務(wù)的一部分。</p><p> 4.2啟動模式以及啟動標記</p><p> 你控制活動和任務(wù)通信的最主要的方法是通過設(shè)置啟動模式的屬性以及意圖相應(yīng)的標記。這兩個參數(shù)能以不同的組合來共同控制活動的啟動結(jié)果,這在相應(yīng)的文檔里有描述。這里我們只描述一些通用的用法以及幾種不同的組合方式。</p>&
46、lt;p> 你最通常使用的模式是singleTop(除了默認為standard模式)。這不會對任務(wù)產(chǎn)生什么影響;僅僅是防止在棧頂多次啟動同一個活動。</p><p> singleTask模式對任務(wù)有一些影響:它能使得活動總是在新的任務(wù)里被打開(或者將已經(jīng)打開的任務(wù)切換到前臺來)。使用這個模式需要加倍小心該進程是如何和系統(tǒng)其他部分交互的,它可能影響所有的活動。這個模式最好被用于應(yīng)用程序入口活動的標記中。
47、(支持MAIN活動和LAUNCHER分類)。</p><p> singleInstance啟動模式更加特殊,該模式只能當整個應(yīng)用只有一個活動時使用。</p><p> 有一種情況你會經(jīng)常遇到,其它實體(如搜索管理器SearchManager 或者 通知管理器NotificationManager)會啟動你的活動。這種情況下,你需要使用 Intent.FLAG_ACTIVITY_NEW
48、_TASK 標記,因為活動在任務(wù)(這個應(yīng)用/任務(wù)還沒有被啟動)之外被啟動。就像之前描述的一樣, 這種情況下標準特性就是當前和任務(wù)和新的活動的親和性匹配的任務(wù)將會切換到前臺,然后在最頂端啟動一個新的活動。當然,你也可以實現(xiàn)其它類型的特性。</p><p> 一個常用的做法就是將Intent.FLAG_ACTIVITY_CLEAR_TOP 和NEW_TASK一起使用。這樣做,如果你的任務(wù)已經(jīng)處于運行中,任務(wù)將會被切
49、換到前臺來, 在棧里的所有的活動除了根活動,都將被清空,根活動的onNewIntent(Intent) 方法傳入意圖參數(shù)后被調(diào)用。當使用這種方法的時候 singleTop 或者 singleTask啟動模式經(jīng)常被使用,這樣當前實例會被置入一個新的意圖,而不是銷毀原先的任務(wù)然后啟動一個新的實例。</p><p> 另外你可以使用的一個方法是設(shè)置活動的任務(wù)親和力為空字串(表示沒有親和力),然后設(shè)置finishOnB
50、ackground屬性。 如果你想讓用戶給你提供一個單獨的活動描述的通知,倒不如返回到應(yīng)用的任務(wù)里,這個比較管用。要指定這個屬性,不管用戶使用BACK還是HOME,活動都會結(jié)束;如果這個屬性沒有指定,按HOME鍵將會導(dǎo)致活動以及任務(wù)還留在系統(tǒng)里,并且沒有辦法返回到該任務(wù)里。</p><p><b> 4.3進程</b></p><p> 在Android中,進程是
51、應(yīng)用程序的完整實現(xiàn),而不是用戶通常了解的那樣。他們主要用途很簡單:</p><p> 提高穩(wěn)定性和安全性,將不信任或者不穩(wěn)定的代碼移動到其他進程。</p><p> 可將多個.apk包運行在同一個進程里減少系統(tǒng)開銷。</p><p> 幫助系統(tǒng)管理資源,將重要的代碼放在一個單獨的進程里,這樣就可以單獨銷毀應(yīng)用程序的其他部分。</p><p&
52、gt; 像前面描述的一樣,進程的屬性被用來控制那些有特殊應(yīng)用組件運行的進程。注意這個屬性不能違反系統(tǒng)安全: 如果兩個.apk包不能共享同一個用戶ID,卻試圖運行在通一個進程里,這種情況是不被允許的,事實上系統(tǒng)將會創(chuàng)建兩個不同的進程。</p><p><b> 4.4線程</b></p><p> 每個進程包含一個或多個線程。多數(shù)情況下,Android 避免在進程
53、里創(chuàng)建多余的線程,除非它創(chuàng)建它自己的線程,我們應(yīng)保持應(yīng)用程序的單線程性。 一個重要的結(jié)論就是所有呼叫實例, 廣播接收器, 以及 服務(wù)的實例都是由這個進程里運行的主線程創(chuàng)建的。</p><p> 注意新的線程不是為活動,廣播接收器,服務(wù)或者內(nèi)容提供器實例創(chuàng)建:這些應(yīng)用程序的組件在進程里被實例化(除非另有說明,都在同一個進程處理),實際上是進程的主線程。這說明當系統(tǒng)調(diào)用時這些組件(包括服務(wù))不需要進程遠距離或者封鎖
54、操作(就像網(wǎng)絡(luò)呼叫或者計算循環(huán)),因為這將阻止進程中的所有其他組件。你可以使用標準的線程 類或者Android的HandlerThread 類去對其它線程執(zhí)行遠程操作。</p><p> 這里有一些關(guān)于創(chuàng)建線程規(guī)則的例外:</p><p> 呼叫IBinder或者IBinder實現(xiàn)的接口,如果該呼叫來自其他進程,你可以通過線程發(fā)送的IBinder或者本地進程中的線程池呼叫它們,從進程的
55、主線程呼叫是不可以的。特殊情況下,,呼叫一個服務(wù) 的IBinder可以這樣處理。(雖然在服務(wù)里呼叫方法在主線程里已經(jīng)完成。)這意味著IBinder接口的實現(xiàn)必須要有一種線程安全的方法,這樣任意線程才能同時訪問它。</p><p> 呼叫由正在被調(diào)用的線程或者主線程以及IBinder派發(fā)的內(nèi)容提供器 的主方法。被指定的方法在內(nèi)容提供器的類里有記錄。這意味著實現(xiàn)這些方法必須要有一種線程安全的模式,這樣任意其它線程同
56、時可以訪問它。</p><p> 呼叫視圖以及由視圖里正在運行的線程組成的子類。通常情況下,這會被作為進程的主線程,如果你創(chuàng)建一個線程并顯示一個窗口,那么繼承的窗口視圖將從那個線程里啟動。</p><p> 5 android 應(yīng)用程序開發(fā)簡介</p><p> 5.1 Activity 介紹</p><p> 5.1.1
57、 activity的作用</p><p> Activity 是android程序的4大組件之一。</p><p> Activity是Android程序的表現(xiàn)層。程序的每一個顯示屏幕就是一個Activity。</p><p> Activity類的繼承關(guān)系:</p><p> Activity是Context類的子類。&l
58、t;/p><p> 5.1.2 Activity的生命周期</p><p> 手機最重要也是最基礎(chǔ)的功能是打電話,也就意味著電話來的時候可能隨時要把現(xiàn)在的程序暫停,如果電量不足的時候也可能隨時把現(xiàn)在的程序關(guān)閉;因此Android程序和電腦上的程序有所不同,具體到Activity,Activity的生命周期不是自身控制的,而是Android系統(tǒng)控制的。</p><p&g
59、t; 在Android中Activity有四種基本的狀態(tài):</p><p><b> Ø Running</b></p><p> 位于屏幕最前端時,此時處于可見狀態(tài),和用戶可交互的狀態(tài)。</p><p><b> Ø Paused</b></p><p&
60、gt; 當Activity被另一個透明的或者非全屏的Activity覆蓋時的狀態(tài)叫做Paused狀態(tài)。雖然可見但不可交互。</p><p><b> Ø Stop</b></p><p> 當Activity被另外一個Activity覆蓋,界面不可見時處于Stop狀態(tài)。</p><p><b> Ø
61、; Killed</b></p><p> Activity被系統(tǒng)殺死或者根本沒啟動時就處于Killed狀態(tài)。</p><p> Activity的生命周期:</p><p><b> Activity棧</b></p><p> Android通過Activity棧的方式來管理Activi
62、ty。</p><p> 正在運行的Activity處在棧的最頂端,它是運行狀態(tài)的。</p><p> 當有新的Activity進入屏幕最上端時,原來的Activity就會被壓入第二層。如果他的屏幕沒有被完 全遮蓋,那么他處于Paused狀態(tài),如果他被遮蓋那么處于Stop狀態(tài)。</p><p> 不管處于任何一層,都可能在系統(tǒng)覺得資源不足時被強行關(guān)閉,當然關(guān)閉
63、時棧底的程序最先被關(guān)閉。</p><p> 譬如:當你在程序中調(diào)用 Activity.finish()方法時,結(jié)果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被“回收”。隨后 Activity Manager 激活處于棧第二層的 Activity 并重 新入棧
64、,把原 Activity 壓入到棧的第二層,從 Running 狀態(tài)轉(zhuǎn)到 Paused 狀態(tài)。</p><p> 5.2 View簡介以及動畫實現(xiàn)原理</p><p> 5.2.1 View簡介</p><p> view是android.view.View基礎(chǔ)類的對象。它是一個存儲有屏幕上特定的一
65、矩形內(nèi)布局和內(nèi)容屬性的數(shù)據(jù)結(jié)構(gòu)。Activity只提供給我們一個框架,相當于的一畫板,他不能獨立完成屏幕的顯示。一個View對象處理測距和布局,繪圖,焦點變換,滾動條,還有屏幕區(qū)域自己表現(xiàn)的按鍵和手勢。viewgroup是android.view.viewgroup類的對象。viewgroup是特殊的view對象,它的功能是去裝載和管理一組下層的view和其他viewgroup。在Android平臺上,用view樹和viewgroup節(jié)
66、點來定義一個Activity的UI。如同圖2一樣。這個樹可以如你需要那樣簡單或者復(fù)雜,并且你可以使用Android的預(yù)定義widget和layout或者你自定義的view類型來構(gòu)建它。</p><p> 我們可以通過繼承view,并重寫view的onDraw方法,運用canvas(畫布)已經(jīng)paint(畫筆),通過canvas的drawRect(畫矩形)、drawBitmap(畫圖片)等方法來實現(xiàn)自定義的圖像顯
67、示。</p><p> 5.2.2 動畫的原理以及在android平臺的實現(xiàn)方法</p><p> 所有的動畫,包括Flash動畫都是一個原理——快速連續(xù)播放靜止的圖片,給人眼產(chǎn)生的錯覺就是畫面會連續(xù)動起來。那些靜止的圖片叫幀;播放速度越快,動畫越流暢。電影膠片的播放速度就是24幀/秒。</p><p> Android 平臺提供了兩類動畫,一類是 Twee
68、n 動畫,即通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉(zhuǎn))產(chǎn)生動畫效果;第二類是 Frame 動畫,即順序播放事先做好的圖像,跟電影類似。本文分析了 Tween 動畫的實現(xiàn)原理。</p><p> 從邏輯上講,android 系統(tǒng)動畫實現(xiàn)需要如下幾步:</p><p> view 創(chuàng)建動畫對象,設(shè)置動畫屬性,調(diào)用 invalidate 刷新屏幕,啟動動畫; </p>
69、<p> invalidate 方法觸發(fā)了 onDraw 函數(shù); </p><p> 在 onDraw 函數(shù)中: </p><p> 調(diào)用動畫的 getTransformation 方法,得到當前時間點的矩陣 </p><p> 將該矩陣設(shè)置成 Canvas 的當前矩陣 </p><p> 調(diào)用 canvas 的 dra
70、wBitmap 方法,繪制屏幕。 </p><p> 判斷 getTransformation 的返回值,若為真,調(diào)用 invalidate 方法,刷新屏幕進入下一楨;若為假,說明動畫完成。 </p><p> 所以,可以通過繼承View運用系統(tǒng)的動畫的原理完成自己自定義的動畫,自定義動畫實現(xiàn)的具體過程:</p><p><b> 開啟線程;<
71、/b></p><p> 判斷狀態(tài),若為真,則進行3,否則就暫停線程,結(jié)束動畫;</p><p> 則給消息隊列傳遞一個消息(不能直接調(diào)用invalidate 方法,因為不是主UI線程,會出現(xiàn)異常)通知view調(diào)用onDraw方法刷新屏幕,暫停一段時間(一般為100ms 這樣動畫的速度就是10幀/s),更新狀態(tài),繼續(xù)2;</p><p> 我們可以根據(jù)自
72、定義的狀態(tài)變量來知道當前動畫的狀態(tài),并根據(jù)動畫的狀態(tài)進行坐標變換以及矩陣變換,繪制出不同的中間圖像,實現(xiàn)各種各樣的動畫。</p><p> 6 Android 日歷應(yīng)用模塊代碼簡介</p><p> 6.1軟件的需求分析以及功能分析</p><p> 此軟件用于android智能手機,智能手機同傳統(tǒng)手機外觀和操作方式類似,無論是觸屏的、全鍵盤的,或者帶攝像
73、頭、立體聲的,從外觀上并不能看出有什么不同來。智能手機的優(yōu)勢在于其功能的可擴展性,傳統(tǒng)手機使用的是生產(chǎn)廠商自行開發(fā)的封閉式操作系統(tǒng),所能實現(xiàn)的功能非常有限。智能手機由于可以安裝第三方軟件,因此其功能可以不斷擴展。智能手機與多功能手機相對,本身并不意味著這個手機有多“聰明”,但是程序開發(fā)者可以利用智能手機實現(xiàn)極其豐富的功能。</p><p> 我們平時用的手機的日歷軟件功能單一、界面簡單,在手機軟件日益豐富的今天
74、,功能強大、界面美觀、操作簡單的手機軟件越來越受到人們的喜愛。傳統(tǒng)的日歷軟件僅僅就顯示時間日期的功能,不能滿足用戶的需求。手機一般都有鬧鈴的功能,也有記錄行程等類似的功能,但是這些功能都是分布在不同軟件,不方便用戶操作,也不便于管理,所以日歷軟件可以加入這些功能,將所有功能用一個軟件來實現(xiàn),來方便用戶操作以及管理。 </p><p> 6.2 各個界面的簡介</p><p><b&
75、gt; 6.2.1主界面</b></p><p> 由ceshi.java以及noteview.java實現(xiàn),ceshi.java是一個Activity類,noteview.java是一個繼承于view的類,用來顯示界面已經(jīng)完成一些界面特效。主界面有2個界面都是由noteview.java實現(xiàn)的。</p><p> 這是一個手機模擬器的界面左邊部分顯示界面,右邊部分是一些
76、按鍵。</p><p> 這是主界面的的另外一個界面,主界面是給用戶查看自己記錄的一下消息,主界面的2個分界面可以通過滑動和或者點擊按鈕來完成切換。</p><p> 6.2.2 編輯界面</p><p> 由edit1.java以及Editview.java來實現(xiàn),eidt1.javashi是一個Activity類并通過加載edit2.xml的ScrollV
77、iew來實現(xiàn)主界面,Editview.java是一個繼承于view的類,用來顯示其他部分的界面。</p><p> 還有其他一些編輯的界面就不一一截取了。該界面給用戶編輯自己要記錄并提醒自己的提醒以及時間,本軟件會根據(jù)用戶定義的時間以及響應(yīng)方式來提醒用戶。</p><p> 6.2.3 刪除消息界面</p><p> 由delete.java已經(jīng)deleteV
78、iew.java來實現(xiàn), deleteView.java繼承于View并完成界面顯示。</p><p> 刪除界面可以給用戶詳細查看自己定義的消息,并提供提供手動刪除,以及重新編輯接口,方便用戶管理自己記錄的提醒。</p><p> 6.2.4 設(shè)置界面</p><p> 由set.java以及setView.java實現(xiàn)。</p><p&
79、gt; 主界面給用戶來設(shè)置是否開啟提醒功能,另外一個界面給用戶設(shè)置提醒顯示的顏色,是用戶能根據(jù)自己喜好選擇顯示的顏色。</p><p><b> 日歷界面</b></p><p> 由Celander.java以及cView.java實現(xiàn)。</p><p> 該界面用來給用戶查看日歷以及提醒。</p><p>&
80、lt;b> 主要功能的實現(xiàn)</b></p><p> 6.3.1 日歷部分的數(shù)據(jù)處理功能</p><p> 這部分功能主要由dateService.java來實現(xiàn),該類提供了一些函數(shù)來進行數(shù)據(jù)處理。</p><p> 該函數(shù)用來計算輸入的時間距離1900年1月1日有多少天。</p><p> public int
81、days(int year, int mouth, int day) {</p><p> int num = 0, i;</p><p> if (year < 1900 || mouth <= 0 || day <= 0)</p><p> return -1;</p><p> for (i = 1900; i
82、 < year; i++) {</p><p> if (isyear(i) == 1) {</p><p> num += 366;</p><p><b> } else {</b></p><p> num += 365;</p><p><b> }</b&
83、gt;</p><p><b> }</b></p><p> for (i = 1; i < mouth; i++) {</p><p> if (i == 2) {</p><p> if (isyear(year) == 1) {</p><p> num += 29;<
84、;/p><p><b> } else</b></p><p> num += 28;</p><p><b> } else {</b></p><p> num += moudat[i - 1];</p><p><b> }</b></
85、p><p><b> }</b></p><p> num += day - 1;</p><p> return num;</p><p><b> }</b></p><p> 該函數(shù)把距離1900年1月1日整形的天數(shù)換算成時間</p><p&g
86、t; public int[] day_date(int num) {</p><p> int a[] = new int[3];</p><p> int tmp = num, i = 1900;</p><p> while (tmp > 365 + isyear(i)) {</p><p> tmp -= 365 +
87、isyear(i);</p><p><b> i++;</b></p><p><b> }</b></p><p><b> a[0] = i;</b></p><p> for (i = 1; i <= 12; i++) {</p><p
88、> if (tmp < mouNum(a[0], i)) {</p><p><b> break;</b></p><p><b> }</b></p><p> tmp -= mouNum(a[0], i);</p><p><b> }</b><
89、;/p><p><b> a[1] = i;</b></p><p> a[2] = tmp + 1;</p><p><b> return a;</b></p><p><b> }</b></p><p> 該函數(shù)用來比較2個數(shù)組大小<
90、/p><p> public int compare(int[] a, int[] b, int length)// 前面數(shù)組大返回1 小返回-1 相等返回0</p><p><b> {</b></p><p><b> int i;</b></p><p> for (i = 0; i &l
91、t; length; i++) {</p><p> if (a[i] > b[i])</p><p><b> return 1;</b></p><p> else if (a[i] < b[i])</p><p> return -1;</p><p><b>
92、 }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 該函數(shù)用于每次用戶切換了月 之后更新cView類的數(shù)據(jù)</p><p> public void update() {</p><p&
93、gt; int i, j, tmp, num;</p><p> for (i = 0; i < number; i++) {</p><p> for (j = 0; j < week; j++) {</p><p> yes[i * week + j] = now[i * week + j];</p><p><
94、b> }</b></p><p><b> }</b></p><p> len_y = len_n;</p><p> for (i = 0; i < daydat.length / 2 - 1; i++) {</p><p> if (year >= daydat[i * 2]
95、 && year < daydat[i * 2 + 2]) {</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> tmp = i;<
96、/b></p><p> num = days(year, mouth, tmp);</p><p> num = (num + daydat[tmp * 2 + 1]) % 7;</p><p> // /更新日歷月份的頭部</p><p> int tmp_m, tmp_y, tmp_d, tmp_now = 0;// tm
97、p_now 標記是否已經(jīng)找到高亮區(qū)域</p><p> Date dat = new Date();</p><p> int[] now_dat = new int[] { dat.getYear() + 1900, dat.getMonth() + 1,</p><p> dat.getDate() };</p><p> int
98、[] tmp_dat;</p><p> if (mouth == 1) {</p><p> tmp_m = 12;</p><p> tmp_y = year - 1;</p><p><b> } else {</b></p><p> tmp_m = mouth - 1;<
99、/p><p> tmp_y = year;</p><p><b> }</b></p><p> tmp_d = date.mouNum(tmp_y, tmp_m);</p><p> for (i = num - 1; i >= 0; i--) {</p><p> if (yea
100、r == 1991 && mouth == 1) {</p><p> now[i] = 0;</p><p><b> } else {</b></p><p> now[i] = tmp_d - num + 1 + i;</p><p> if (tmp_now == 0)// 沒找到高亮區(qū)域
101、</p><p><b> {</b></p><p> tmp_dat = new int[] { tmp_y, tmp_m, tmp_d - num + 1 + i };</p><p> if (date.compare(now_dat, tmp_dat, 3) == 0) {</p><p> now_i
102、 = 0;</p><p> now_j = i;</p><p> now_tmp = 0;</p><p> tmp_now = 1;</p><p><b> }</b></p><p><b> }</b></p><p><b
103、> }</b></p><p><b> }</b></p><p> // /更新日歷的中部和尾部</p><p> int tmp_2 = date.mouNum(year, mouth);</p><p> int tmp_1 = (tmp_2 + num) % 7;</p>
104、<p> if (tmp_1 == 0)</p><p> len_n = (tmp_2 + num) / 7;</p><p><b> else</b></p><p> len_n = (tmp_2 + num) / 7 + 1;</p><p> for (i = 1; i <= t
105、mp_2; i++) {</p><p> now[num - 1 + i] = i;</p><p> if (tmp_now == 0)// 沒找到高亮區(qū)域</p><p><b> {</b></p><p> tmp_dat = new int[] { year, mouth, i };</p>
106、;<p> if (date.compare(now_dat, tmp_dat, 3) == 0) {</p><p> now_i = (num - 1 + i) / week;</p><p> now_j = (num - 1 + i) % week;</p><p> now_tmp = 1;</p><p>
107、 tmp_now = 1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> for (i = tmp_1; i < 7; i++) {</p><p>
108、now[tmp_2 + num - tmp_1 + i] = i - tmp_1 + 1;</p><p> if (tmp_now == 0)// 沒找到高亮區(qū)域</p><p><b> {</b></p><p> if (mouth == 12) {</p><p> tmp_y = year + 1;&
109、lt;/p><p> tmp_m = 1;</p><p><b> } else {</b></p><p> tmp_y = year;</p><p> tmp_m = mouth+1;</p><p><b> }</b></p><p>
110、; tmp_dat = new int[] { tmp_y, tmp_m, i - tmp_1 + 1 };</p><p> if (date.compare(now_dat, tmp_dat, 3) == 0) {</p><p> now_i = len_n - 1;</p><p> now_j = (tmp_2 + num - tmp_1 + i)
111、 % week;</p><p> now_tmp = 0;</p><p> tmp_now = 1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&
112、lt;p> if (tmp_now == 0)// 最后如果沒找到?jīng)]找到高亮區(qū)域</p><p><b> {</b></p><p> now_i = -1;</p><p> now_j = -1;</p><p><b> }</b></p><p>&
113、lt;b> }</b></p><p><b> 提醒的保存與讀取</b></p><p> 這部分功能主要由FileDeal.java實現(xiàn)。FileDeal繼承于FileService, FileService提供了2個方法,一個是save 用來把字符型數(shù)據(jù)通過IO流以文件方式保存,另外一個方法read,通過IO流來讀取文件,并將數(shù)據(jù)轉(zhuǎn)換成字
114、符型。</p><p> public void save(String fileName, String fileContent) throws Exception {</p><p> FileOutputStream file = this.context.openFileOutput(fileName,</p><p> Context.MODE_PR
115、IVATE);</p><p> file.write(fileContent.getBytes());</p><p> file.close();</p><p><b> }</b></p><p> public String read(String fileName) throws Exception
116、{</p><p> FileInputStream file = this.context.openFileInput(fileName);</p><p> ByteArrayOutputStream byteArray = new ByteArrayOutputStream();</p><p> byte[] buffer = new byte[102
117、4];</p><p> int len = 0;</p><p> while ((len = file.read(buffer)) > 0) {</p><p> byteArray.write(buffer, 0, len);</p><p><b> }</b></p><p&g
118、t; file.close();</p><p> return byteArray.toString();</p><p><b> }</b></p><p> FileDeal load的方法把父類的read方法讀取出來的字符型數(shù)據(jù)換算成自定義的數(shù)據(jù),而save方法則把自定義的數(shù)據(jù)變換成字符型并通過父類的save保存至文件中。&l
119、t;/p><p> public boolean save() {</p><p> String s = "";</p><p> if (length >= 0 && length <= length_file) {</p><p><b> int i, j;</b&g
120、t;</p><p> s += length + "\n";</p><p> for (i = 0; i < length; i++) {</p><p> for (j = 0; j < length_note; j++) {</p><p> s += data[i][j] + " &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于andrid平臺opengl圖形圖像接口應(yīng)用研究【開題報告】
- 基于linuxqt圖形圖像課程設(shè)計
- 圖形圖像課程設(shè)計---圖像銳化
- 圖形圖像廣告平面設(shè)計畢業(yè)論文
- 圖形圖像廣告平面設(shè)計畢業(yè)論文
- 圖形圖像論文處理
- 圖形圖像處理圖像分割
- 基于智能可視定制平臺CVIDraw的圖形圖像Web發(fā)布的研究.pdf
- 基于二維條形碼的圖形圖像處理與應(yīng)用研究.pdf
- 圖形圖像處理技術(shù)在數(shù)控編程中的應(yīng)用研究.pdf
- 專題十五圖形圖像專題
- 圖形圖像處理matlab
- 基于圖形圖像技術(shù)的鞋類造型仿真設(shè)計的研究.pdf
- 在役管線圖形圖像處理及故障分類應(yīng)用研究.pdf
- 四元數(shù)及其在圖形圖像處理中的應(yīng)用研究.pdf
- 基于圖形圖像知識的圖案創(chuàng)作思維模擬及應(yīng)用.pdf
- 圖形圖像處理課程設(shè)計報告
- 圖形圖像界面中的圖標設(shè)計.pdf
- 激光直寫機圖形圖像軟件設(shè)計
- 單元七圖形圖像處理
評論
0/150
提交評論