版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
網(wǎng)絡(luò)編程第7章學(xué)習(xí)目標(biāo)熟悉Http、Https協(xié)議的基本概念理解多線程在Android中的實(shí)現(xiàn)掌握HttpURLConnection類(lèi)及方法(★)掌握J(rèn)SON數(shù)據(jù)解析(★)掌握Handler消息處理技術(shù)(★)掌握Android的網(wǎng)絡(luò)開(kāi)發(fā)方法(★)2026/2/10第7章Android網(wǎng)絡(luò)編程2內(nèi)容大綱Android的多線程Handler消息處理機(jī)制網(wǎng)絡(luò)的基本概念及Http協(xié)議Android的網(wǎng)絡(luò)訪問(wèn)Android的網(wǎng)絡(luò)框架2026/2/10第7章Android網(wǎng)絡(luò)編程3上次課回顧多線程的創(chuàng)建方法Handler的消息傳遞編碼實(shí)現(xiàn)WebView如何加載網(wǎng)頁(yè)2026/2/104第7章Android網(wǎng)絡(luò)編程補(bǔ)充:網(wǎng)絡(luò)的基本概念及Http協(xié)議網(wǎng)絡(luò)的基本知識(shí)IP地址和端口號(hào)IP地址:網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)都必須有一個(gè)唯一的IP地址作為標(biāo)識(shí),用一組由"."分隔的十進(jìn)制數(shù)組成端口號(hào):IP地址只能保證將數(shù)據(jù)送到指定的計(jì)算機(jī),但無(wú)法知道交給該主機(jī)的哪個(gè)網(wǎng)絡(luò)程序,因此采用端口號(hào)標(biāo)識(shí)計(jì)算機(jī)上正在運(yùn)行的進(jìn)程每個(gè)被發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包都包含端口號(hào),用于將該數(shù)據(jù)幀交給具有相同端口號(hào)的應(yīng)用程序處理Java的網(wǎng)絡(luò)編程由包中的類(lèi)進(jìn)行處理InetAddress類(lèi):描述IP地址2026/2/10第7章Android網(wǎng)絡(luò)編程6網(wǎng)絡(luò)協(xié)議2026/2/10第7章Android網(wǎng)絡(luò)編程7HTTP協(xié)議HTTP(HyperTextTransferProtocol)即超文本傳輸協(xié)議,它規(guī)定了瀏覽器和服務(wù)器之間相互通信的規(guī)則,是一種請(qǐng)求/響應(yīng)式的應(yīng)用層的面向?qū)ο蟮膮f(xié)議,適用于分布式超媒體信息系統(tǒng)主要特點(diǎn)支持C/S模式簡(jiǎn)單快速:只需傳送請(qǐng)求方法和路徑,請(qǐng)求方法常用的有:GET、HEAD、POST等靈活:允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象,用Content-Type進(jìn)行標(biāo)記無(wú)連接:限制每次連接只處理一個(gè)請(qǐng)求無(wú)狀態(tài):對(duì)事務(wù)處理沒(méi)有記憶功能HTTP的URL的格式:http://host[:port][/path]http表示要通過(guò)HTTP協(xié)議來(lái)定位網(wǎng)絡(luò)資源;host表示合法的Internet主機(jī)域名或者IP地址;port指定一個(gè)端口號(hào),為空則使用默認(rèn)端口80;path指定請(qǐng)求資源的URI2026/2/10第7章Android網(wǎng)絡(luò)編程8HTTP請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求報(bào)頭、空行和請(qǐng)求數(shù)據(jù)4個(gè)部分組成2026/2/109第7章Android網(wǎng)絡(luò)編程HTTP響應(yīng)報(bào)文由狀態(tài)行、消息報(bào)頭、空行、響應(yīng)正文組成2026/2/1010第7章Android網(wǎng)絡(luò)編程常見(jiàn)的狀態(tài)碼200OK:客戶端請(qǐng)求成功400BadRequest:客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解401Unauthorized:請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用403Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)404NotFound:服務(wù)器無(wú)法根據(jù)客戶端的請(qǐng)求找到資源500InternalServerError:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤503ServerUnavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常2026/2/1011第7章Android網(wǎng)絡(luò)編程2026/2/10第7章Android網(wǎng)絡(luò)編程12https請(qǐng)求HTTPS(HyperTextTransferProtocoloverSecureSocketLayer),是以安全為目標(biāo)的HTTP通道,也就是HTTP的安全版HTTPS=HTTP+SSL/TLSHTTPS的安全基礎(chǔ)是SSLHTTPS的請(qǐng)求過(guò)程HTTPS和HTTP的主要區(qū)別https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)較少,需要一定費(fèi)用http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全2026/2/10第7章Android網(wǎng)絡(luò)編程13HTTPS的請(qǐng)求過(guò)程2026/2/10第7章Android網(wǎng)絡(luò)編程147.3基于HTTP的網(wǎng)絡(luò)編程Android的網(wǎng)絡(luò)編程Http通信HttpURLConnectionAndroid2.3之后,HttpURLConnection是Android網(wǎng)絡(luò)編程的最佳選擇,它的API簡(jiǎn)單,體積較小,壓縮和緩存機(jī)制有效較少網(wǎng)絡(luò)訪問(wèn)的流量HttpClient(自學(xué))Android官方向開(kāi)發(fā)者建議:在Android2.2版本及以下可以使用HttpClient,在2.3以上版本則應(yīng)該使用HttpURLConnectionAndroid6.0刪除了HttpClient類(lèi)庫(kù)Socket通信物聯(lián)網(wǎng),如:t-io(官網(wǎng)/)2026/2/1016第7章Android網(wǎng)絡(luò)編程Android9.0的http網(wǎng)絡(luò)請(qǐng)求問(wèn)題Android9.0開(kāi)始要求:默認(rèn)使用加密連接,禁止App使用任何未加密的連接,因此需要使用TLS(TransportLayerSecurity)傳輸層安全協(xié)議,也就是HttpsAndroid9.0使用HttpUrlConnection進(jìn)行http的get請(qǐng)求會(huì)出現(xiàn)以下異常W/System.err:java.io.IOException:CleartextHTTPtrafficto****notpermitted解決方案:推薦:使用Https連接targetSdkVersion降到27以下版本更改網(wǎng)絡(luò)安全配置,此更改與網(wǎng)站有關(guān),有時(shí)不能得到響應(yīng)2026/2/1017第7章Android網(wǎng)絡(luò)編程Android9.0的http網(wǎng)絡(luò)請(qǐng)求問(wèn)題更改網(wǎng)絡(luò)安全配置在res新增xml目錄,創(chuàng)建network_security_config.xml,開(kāi)啟http請(qǐng)求在AndroidManifest.xml中的application標(biāo)簽增加以下屬性或者在AndroidManifest.xml配置application的屬性2026/2/1018<network-security-config>
<base-configcleartextTrafficPermitted="true"/>
</network-security-config>android:networkSecurityConfig="@xml/network_security_config"android:usesCleartextTraffic="true"第7章Android網(wǎng)絡(luò)編程Android的Https自定義X509TrustManager在使用HttpsURLConnection發(fā)起HTTPS請(qǐng)求的時(shí)候,提供了一個(gè)自定義的X509TrustManager,未實(shí)現(xiàn)安全校驗(yàn)邏輯如果不提供自定義X509TrustManager,代碼運(yùn)行起來(lái)可能會(huì)報(bào)異常自定義HostnameVerifier在握手期間,如果URL的主機(jī)名和服務(wù)器的標(biāo)識(shí)主機(jī)名不匹配,則驗(yàn)證機(jī)制可以回調(diào)此接口的實(shí)現(xiàn)程序來(lái)確定是否應(yīng)該允許此連接。2026/2/1019第7章Android網(wǎng)絡(luò)編程URL類(lèi)統(tǒng)一資源定位符(URL):對(duì)可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問(wèn)的一種簡(jiǎn)潔表示方式,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址(百度百科)互聯(lián)網(wǎng)上的每個(gè)資源都有一個(gè)唯一的URLURL類(lèi)提供了多個(gè)構(gòu)造器用于創(chuàng)建URL對(duì)象URL類(lèi)提供多個(gè)方法訪問(wèn)URL對(duì)應(yīng)的資源:URLConnectionopenConnection():返回一個(gè)URLConnection對(duì)象,它表示到URL所引用的遠(yuǎn)程對(duì)象的連接InputStreamopenStream():打開(kāi)此URL的連接,返回用于讀取該URL資源的輸入流2026/2/1020第7章Android網(wǎng)絡(luò)編程AndroidURL通信AndroidHTTPURL接口的基本操作包括:創(chuàng)建URL以及HttpURLConnection對(duì)象設(shè)置連接參數(shù)連接到服務(wù)器向服務(wù)器寫(xiě)數(shù)據(jù)從服務(wù)器讀取數(shù)據(jù)2026/2/1021第7章Android網(wǎng)絡(luò)編程AndroidURL通信HttpURLConnection是Java
API的標(biāo)準(zhǔn)接口,包含在J包中,繼承自URLConnection類(lèi)URLConnection與HttpURLConnection都是抽象類(lèi),無(wú)法直接實(shí)例化,通過(guò)URL的openConnection方法獲得對(duì)象2026/2/1022URLurl=newURL("");
HttpURLConnection
connection=(HttpURLConnection)url.openConnection();HttpURLConnection獲取輸入、輸出流的方法getInputStream():獲得輸入流,調(diào)用此方法后才真正發(fā)生連接getOutputStream():獲得輸出流第7章Android網(wǎng)絡(luò)編程AndroidURL通信HttpURLConnection訪問(wèn)HTTP資源的步驟:根據(jù)URL地址創(chuàng)建URL對(duì)象使用URL的openConnection()方法獲取HttpURLConnection對(duì)象設(shè)置連接的屬性,包括GET/POST請(qǐng)求方式輸入、輸出數(shù)據(jù)關(guān)閉輸入、輸出流在AndroidManifest配置文件中設(shè)置訪問(wèn)INTERNET的權(quán)限案例:D0703_Network2026/2/1023第7章Android網(wǎng)絡(luò)編程AndroidURL通信HttpURLConnection使用的注意事項(xiàng)使用setConnectTimeout()方法設(shè)置連接超時(shí),當(dāng)網(wǎng)絡(luò)不好時(shí),Android系統(tǒng)會(huì)在超過(guò)設(shè)置時(shí)間后收回資源,中斷操作。通過(guò)getResponseCode()對(duì)響應(yīng)碼進(jìn)行判斷,如果返回響應(yīng)碼為200,則表示連接成功在對(duì)大文件操作時(shí),要將文件寫(xiě)到SDCard上,不要直接寫(xiě)到手機(jī)內(nèi)存上操作大文件時(shí),要一邊從網(wǎng)絡(luò)上讀取,一邊往SDCard上寫(xiě)入,減少手機(jī)內(nèi)存的使用對(duì)文件流操作完畢后要及時(shí)關(guān)閉Android4.0后所有網(wǎng)絡(luò)通信的操作都不能在主線程進(jìn)行,需要使用獨(dú)立的線程完成2026/2/1024第7章Android網(wǎng)絡(luò)編程補(bǔ)充:常用的免費(fèi)API接口提供者天行數(shù)據(jù):/,注冊(cè)獲取APIKey聚合數(shù)據(jù):/,每個(gè)接口有appKey易源數(shù)據(jù):/,注冊(cè)申請(qǐng)獲取appkey接口大全:/
和風(fēng)天氣:/
MobTech:/。。。。。。
2026/2/1025第7章Android網(wǎng)絡(luò)編程解析JSONJSON概述JSON:JavaScriptObjectNotation,最初是針對(duì)JavaScript而設(shè)計(jì),能夠很方便地在字符串和JavaScript對(duì)象中進(jìn)行轉(zhuǎn)換。后來(lái)成為了一種世界通用的數(shù)據(jù)交換標(biāo)準(zhǔn),獨(dú)立于具體的編程語(yǔ)言。與XML相比,JSON語(yǔ)法簡(jiǎn)明,格式緊湊,易讀易懂,數(shù)據(jù)傳輸量小,在移動(dòng)互聯(lián)時(shí)代,這些特點(diǎn)有著巨大的吸引力,因此,JSON成為了XML的替代者而被廣泛應(yīng)用。/json-zh.html2026/2/1027第7章Android網(wǎng)絡(luò)編程使用Json對(duì)象和數(shù)組表示數(shù)據(jù){"name"
:
"張三","courses":
["Java程序設(shè)計(jì)","面向?qū)ο筌浖_(kāi)發(fā)實(shí)踐","軟件工程基礎(chǔ)實(shí)習(xí)"]}2026/2/1028[{"Name":"張三",
"Age":"40"
},{"Name":"李四",
"Age":"20"},{"Name":"王五",
"Age":"35"
},{"Name":"趙六",
"Age":"50"},]第7章Android網(wǎng)絡(luò)編程JSON的屬性值的類(lèi)型數(shù)字:整數(shù)或浮點(diǎn)數(shù)字符串:雙引號(hào)""邏輯值:true、false數(shù)組:方括號(hào)[]對(duì)象:花括號(hào){}null2026/2/1029第7章Android網(wǎng)絡(luò)編程JSON格式的字符串2026/2/10第7章Android網(wǎng)絡(luò)編程30Android解析JSON2026/2/1031Android內(nèi)置JSONArrayJSONObject第三方GsonFastJSONJackson將Json文檔轉(zhuǎn)換為JSONObject或JSONArray對(duì)象將Json文檔轉(zhuǎn)換為Java對(duì)象第7章Android網(wǎng)絡(luò)編程JSONObject類(lèi)方法名功能描述JSONObject()構(gòu)造一個(gè)空的JSONObject對(duì)象JSONObject(str)根據(jù)JSON字符串的鍵值對(duì)構(gòu)造一個(gè)JSONObject對(duì)象JSONArray(str)根據(jù)JSON字符串的鍵值對(duì)構(gòu)造一個(gè)JSONArray數(shù)組getJSONArray(str)返回str映射的JSONArray數(shù)組對(duì)象getJSONObject(str)返回str映射的JSONObject對(duì)象getXxx(str)返回str映射的值,Xxx類(lèi)型:boolean、double、int、long、Stringlength()返回此對(duì)象中的名稱(chēng)/值映射的數(shù)量put(str,value)設(shè)置關(guān)鍵字為String類(lèi)型的值,類(lèi)型可以為基本類(lèi)型、對(duì)象,返回JSONObject對(duì)象optXxx(str)與getXxx()含義相同,如果不存在則返回默認(rèn)值,不報(bào)異常,推薦使用2026/2/10第7章Android網(wǎng)絡(luò)編程32JSONObjectJSONObject是"Key-Value"的集合Key:String類(lèi)型Value:基本數(shù)據(jù)類(lèi)型包裝類(lèi)(String、Boolean、Integer、Long、Double)、JSONObject、JSONArrayJSONObject可以再嵌套JSONObject或JSONArray,構(gòu)成一個(gè)多級(jí)嵌套的結(jié)構(gòu)2026/2/1033JSONObjectjsonObj=newJSONObject(jsonStr);第7章Android網(wǎng)絡(luò)編程JSONArrayJSONArray代表一個(gè)JSON對(duì)象的集合,但其中也可以再放置另一個(gè)JSONArray,構(gòu)成一種多層嵌套的結(jié)構(gòu)。2026/2/1034JSONObjectJSONArrayJSONArrayJSONArrayjsonArr=newJSONArray(jsonString);第7章Android網(wǎng)絡(luò)編程Gson官網(wǎng):/google/gson導(dǎo)入依賴(lài):implementation'com.google.code.gson:gson:2.8.6'2026/2/1035第7章Android網(wǎng)絡(luò)編程Gson工作原理2026/2/1036JSON文檔/數(shù)據(jù)Java
ObjectJava
ObjectJava
Objectnew
Gson()fromJson()toJson()Android使用的Java對(duì)象第7章Android網(wǎng)絡(luò)編程GSON類(lèi)2026/2/10第7章Android網(wǎng)絡(luò)編程37類(lèi)型方法名稱(chēng)功能描述創(chuàng)建實(shí)例Gson()構(gòu)造方法創(chuàng)建GsonBuilder().create()使用GsonBuilder對(duì)象的create()創(chuàng)建反序列化fromJson(Stringjson,Class<T>clazz)將指定的JSON反序列化為指定類(lèi)對(duì)象fromJson(Stringjson,Typetype)將指定的JSON反序列化為指定泛型對(duì)象fromJson(JsonElementjson,Class<T>clazz)將指定的JSON反序列化為指定類(lèi)對(duì)象fromJson(Readerjson,Class<T>clazz)從輸入流讀取JSON序列化為指定類(lèi)對(duì)象序列化toJson(Objectsrc)將Java對(duì)象序列化為JSON字符串toJson(Objectsrc,Typetype)將Java泛型對(duì)象序列化為JSON字符串toJson(JsonElementjsonElement)將JsonElement轉(zhuǎn)換為JSON字符串JsonElementgetAsBoolean()元素作為布爾值獲取,其它Java類(lèi)型類(lèi)似isJsonNull()驗(yàn)證此元素是否為null值JsonObjectaddProperty(Stringproperty,Stringvalue)添加健值對(duì)的成員,名稱(chēng)必須是字符串getAsJsonObject(Stringproperty)元素作為JsonObject獲取remove(Stringproperty)從JsonObject刪除指定屬性FastJSON官網(wǎng):/alibaba/fastjson導(dǎo)入依賴(lài):2026/2/1038implementation'com.alibaba:fastjson:1.2.51'第7章Android網(wǎng)絡(luò)編程FastJSON的工作原理2026/2/1039JSON文檔/數(shù)據(jù)Java
ObjectJava
ObjectJava
ArrayJSON.parseArray()JSON.toJSONString()Android使用的Java對(duì)象JSON.parseObject()第7章Android網(wǎng)絡(luò)編程Gson默認(rèn)序列化行為2026/2/1040靜態(tài)字段不序列化值為null的字段不序列化,反序列化時(shí),"缺"數(shù)據(jù)的字段設(shè)為nullGson默認(rèn)序列化行為特性第7章Android網(wǎng)絡(luò)編程Java對(duì)象數(shù)組的序列化JDK中定義有諸多集合類(lèi)型,Gson對(duì)其支持不好,因此,在開(kāi)發(fā)中,建議只針對(duì)數(shù)組進(jìn)行序列化和反序列化FastJSON對(duì)集合的解析優(yōu)于Gson如果需要反序列化為其他集合類(lèi)型,請(qǐng)使用JSONObject和JSONArray手動(dòng)完成,或者使用FastJson2026/2/1041第7章Android網(wǎng)絡(luò)編程第三方數(shù)據(jù)的獲取方式獲取第三方數(shù)據(jù)的學(xué)習(xí)路徑打開(kāi)聚合數(shù)據(jù)等數(shù)據(jù)提供商的網(wǎng)站,注冊(cè)賬號(hào)搜索需要的數(shù)據(jù)API,打開(kāi)開(kāi)發(fā)文檔閱讀API文檔說(shuō)明,理解API的應(yīng)用打開(kāi)API的示例代碼,找到Java或Android的示例代碼閱讀并理解示例代碼,按照要求寫(xiě)入自己的項(xiàng)目中2026/2/1042第7章Android網(wǎng)絡(luò)編程7.4網(wǎng)絡(luò)訪問(wèn)框架Android常用的網(wǎng)絡(luò)編程框架VolleyGoogle官方推出的一套小而巧的異步請(qǐng)求庫(kù),支持HttpClient(Android6.0之后不再支持)、HttpURLConnection基于網(wǎng)絡(luò)隊(duì)列,適合小數(shù)據(jù)頻繁通信,請(qǐng)求線程池默認(rèn)大小為4OkHttp高性能http庫(kù),支持同步、異步,并支持http2、websocket協(xié)議,api簡(jiǎn)潔易用,實(shí)現(xiàn)了http緩存Android網(wǎng)絡(luò)訪問(wèn)的源碼已用OkHttp代替了HttpURLConnectionRetrofit:基于OkHttp封裝的一套R(shí)ESTful網(wǎng)絡(luò)請(qǐng)求框架,底層默認(rèn)采用OkHttp目前網(wǎng)絡(luò)框架的最好選擇:RxJava+Retrofit+OkHttp2026/2/1044第7章Android網(wǎng)絡(luò)編程O(píng)kHttp官網(wǎng):http://square.github.io/okhttp/源碼:/square/okhttp
配置OkHttp支持Android2.3及其以上版本,Java要求JDK1.7以上添加依賴(lài):implementation'com.squareup.okhttp3:okhttp:4.9.0'添加權(quán)限:<uses-permissionandroid:name="android.permission.INTERNET"/>特點(diǎn)OkHttp是Android版Http客戶端,非常高效,支持SPDY、連接池、GZIP和HTTP緩存默認(rèn)情況下,OkHttp會(huì)自動(dòng)處理常見(jiàn)的網(wǎng)絡(luò)問(wèn)題,像二次連接、SSL的握手問(wèn)題如果應(yīng)用程序集成了OkHttp,Retrofit默認(rèn)會(huì)使用OkHttp處理其他網(wǎng)絡(luò)層請(qǐng)求從Android4.4開(kāi)始,HttpURLConnection的底層實(shí)現(xiàn)采用了OkHttp2026/2/1045第7章Android網(wǎng)絡(luò)編程O(píng)kHttp開(kāi)發(fā)思路OkHttp的每次網(wǎng)絡(luò)請(qǐng)求是一個(gè)Request,提供Request必要的參數(shù)url、header等,基于Request構(gòu)造出一個(gè)Call對(duì)象,再調(diào)用它的execute()方法,就能取得WebServer回復(fù)的數(shù)據(jù)如果同步調(diào)用,需要在獨(dú)立的線程中執(zhí)行,使用異步調(diào)用,則采用回調(diào)的方式執(zhí)行,在內(nèi)部封裝了一個(gè)請(qǐng)求隊(duì)列。OkHttp依賴(lài)另一個(gè)組件okio完成高性能的I/O操作基本用法新建一個(gè)OkHttpClient對(duì)象通過(guò)Request.Builder對(duì)象新建一個(gè)Request對(duì)象通過(guò)Request對(duì)象構(gòu)造Call對(duì)象,調(diào)用enqueue()以異步的方式將call加入調(diào)度隊(duì)列,等待request執(zhí)行完成通過(guò)Call對(duì)象的Callback對(duì)象返回執(zhí)行結(jié)果2026/2/1046第7章Android網(wǎng)絡(luò)編程O(píng)kHttp請(qǐng)求數(shù)據(jù)Get異步請(qǐng)求在另外的工作線程執(zhí)行http請(qǐng)求,請(qǐng)求時(shí)不會(huì)阻塞當(dāng)前的線程,所以能在Android主線程中使用異步請(qǐng)求需要加入到一個(gè)請(qǐng)求隊(duì)列中,并且要指定回調(diào)方法post異步請(qǐng)求通過(guò)RequestBody構(gòu)建請(qǐng)求數(shù)據(jù),然后調(diào)用post()方法發(fā)送請(qǐng)求post異步請(qǐng)求JSON數(shù)據(jù),需要設(shè)置MimeType類(lèi)型案例:D0704_Framework2026/2/10第7章Android網(wǎng)絡(luò)編程47圖片加載框架GlideGlide是由Google開(kāi)源的一個(gè)圖片加載庫(kù),是快速高效的Android開(kāi)源媒體管理和圖像加載框架它將媒體解碼、內(nèi)存和磁盤(pán)緩存以及資源池包裝成簡(jiǎn)單易用的界面。Github:/bumptech/glide中文參考文檔:https://muyangmin.github.io/glide-docs-cn/2026/2/1048第7章Android網(wǎng)絡(luò)編程圖片加載框架Glide添加依賴(lài)添加網(wǎng)絡(luò)權(quán)限使用2026/2/1049implementation'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor'com.github.bumptech.glide:compiler:4.11.0'
//https圖片處理
implementation"com.github.bumptech.glide:okhttp3-integration:4.11.0"Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);<uses-permissionandroid:name="android.permission.INTERNET"/>第7章Android網(wǎng)絡(luò)編程圖片加載框架Glide加載圖片的一般方法常用方法:/p/2edd1767d66b2026/2/1050Glide.with(Contextcontext).load(Strinturl).into(ImageViewimageView);
第7章Android網(wǎng)絡(luò)編程Glide集成OkHttp加載https圖片導(dǎo)入依賴(lài):創(chuàng)建支持https的OkHttpClient對(duì)象創(chuàng)建繼承AppGlideModule的類(lèi),重寫(xiě)registerComponents()方法使用時(shí),用GlideApp替代Glide類(lèi)2026/2/10第7章Android網(wǎng)絡(luò)編程51implementation'com.github.bumptech.glide:okhttp3-integration:4.10.0'Volley框架官網(wǎng):/google/volley在app的build.gradle導(dǎo)入依賴(lài)implementation'com.android.volley:volley:1.1.1'Volley的開(kāi)發(fā)流程創(chuàng)建一個(gè)RequestQueue對(duì)象創(chuàng)建一個(gè)Request對(duì)象將Request對(duì)象添加到RequestQueue里面2026/2/1052第7章Android網(wǎng)絡(luò)編程RetrofitAtype-safeRESTclientforAndroidandJava針對(duì)Android和Java應(yīng)用開(kāi)發(fā)的一個(gè)類(lèi)型安全的REST客戶端程序網(wǎng)絡(luò)庫(kù)官網(wǎng):http://square.github.io/retrofit/源碼:/square/retrofitAndroidStudio的配置添加依賴(lài):implementation'com.squareup.retrofit2:retrofit:2.4.0'由于Retrofit依賴(lài)OkHttp,還需加入OkHttp的依賴(lài)設(shè)置權(quán)限:<uses-permissionandroid:name="android.permission.INTERNET"/>2026/2/1053第7章Android網(wǎng)絡(luò)編程Rtrofit工作原理Retrofit使用一個(gè)Java接口來(lái)訪問(wèn)一個(gè)特定的RESTAPI,在定義接口時(shí),通過(guò)各種注解(annotation)來(lái)定義HTTP請(qǐng)求的各種參數(shù)與特性,集成了URL參數(shù)替換和查詢字符串生成的功能,并能支持文件上傳和基于HTML表單的數(shù)據(jù)發(fā)送。Retrofit底層依賴(lài)OkHttp實(shí)現(xiàn),Retrofit本質(zhì)上是對(duì)OkHttp的更進(jìn)一步封裝。編程套路Retrofit將HTTPAPI轉(zhuǎn)化成了Java接口的形式Retrofit類(lèi)可以針對(duì)之前定義的接口生成一個(gè)具體實(shí)現(xiàn)然后就可以調(diào)用生成的對(duì)象所提供的方法進(jìn)行網(wǎng)絡(luò)的同步或異步訪問(wèn)2026/2/10第7章Android網(wǎng)絡(luò)編程54總結(jié)Http協(xié)議的基本概念HttpClientConnection網(wǎng)絡(luò)編程結(jié)合Handler進(jìn)行網(wǎng)絡(luò)編程及數(shù)據(jù)處理使用FastJson、Gson或JackJson解析json數(shù)據(jù)OkHttp框架使用第三方數(shù)據(jù)的流程2026/2/1055第7章Android網(wǎng)絡(luò)編程作業(yè)?思考題簡(jiǎn)述三種實(shí)現(xiàn)多線程方法的區(qū)別。簡(jiǎn)述使用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的步驟。簡(jiǎn)述Handler消息傳遞機(jī)制的原理。簡(jiǎn)述OkHttp網(wǎng)絡(luò)框架的基本原理。?編程題使用兩種多線程的實(shí)現(xiàn)方法,完成2個(gè)窗口同時(shí)賣(mài)火車(chē)票;每個(gè)窗口賣(mài)100張,賣(mài)票速度都是1張/s的功能。使用OkHttp框架重構(gòu)【案例7-3】的天氣預(yù)報(bào)。2026/2/1056第7章Android網(wǎng)絡(luò)編程提問(wèn)時(shí)間2026/2/10第7章Android網(wǎng)絡(luò)編程57待續(xù)…多媒體技術(shù)58網(wǎng)絡(luò)編程第7章學(xué)習(xí)目標(biāo)熟悉Http、Https協(xié)議的基本概念理解多線程在Android中的實(shí)現(xiàn)掌握HttpURLConnection類(lèi)及方法(★)掌握J(rèn)SON數(shù)據(jù)解析(★)掌握Handler消息處理技術(shù)(★)掌握Android的網(wǎng)絡(luò)開(kāi)發(fā)方法(★)2026/2/10第7章Android網(wǎng)絡(luò)編程60內(nèi)容大綱Android的多線程Handler消息處理機(jī)制網(wǎng)絡(luò)的基本概念及Http協(xié)議Android的網(wǎng)絡(luò)訪問(wèn)Android的網(wǎng)絡(luò)框架2026/2/10第7章Android網(wǎng)絡(luò)編程61上次課回顧服務(wù)的生命周期及應(yīng)用場(chǎng)景服務(wù)的啟動(dòng)與綁定的區(qū)別服務(wù)與Activity之間的數(shù)據(jù)交互廣播的基本概念廣播的分類(lèi)及區(qū)別發(fā)送與接收廣播2026/2/1062第7章Android網(wǎng)絡(luò)編程7.1Android的多線程多線程的概念A(yù)ndroid的多線程本質(zhì)上是Java的多線程實(shí)現(xiàn)多線程的方式繼承Thread類(lèi)實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)FutureTask接口和Callable接口回調(diào)實(shí)現(xiàn)有返回值的線程案例:D0701_MultiThread2026/2/10第7章Android網(wǎng)絡(luò)編程64線程的狀態(tài)轉(zhuǎn)換2026/2/10第7章Android網(wǎng)絡(luò)編程65Android的多線程Android的線程分為主線程和子線程主線程:也稱(chēng)為UI線程,運(yùn)行四大組件以及處理與用戶的交互子線程:執(zhí)行耗時(shí)任務(wù),比如:網(wǎng)絡(luò)請(qǐng)求、I/O操作等Android規(guī)定:如果在主線程中執(zhí)行耗時(shí)操作,會(huì)導(dǎo)致程序無(wú)法及時(shí)響應(yīng),即:ANR,ApplicationNotRespondingAndroid的UI控件是線程不安全的,多線程的并發(fā)訪問(wèn)會(huì)導(dǎo)致UI控件的狀態(tài)不可預(yù)期Android禁止子線程更新UI控件,所有界面更新都必須在UI線程進(jìn)行2026/2/10第7章Android網(wǎng)絡(luò)編程66主線程與子線程的交互Handler:與Thread結(jié)合,最常用的交互方式IntentService:特殊的Service,用于處理通過(guò)Intent傳遞的異步請(qǐng)求AsyncTask:Android11被棄用ThreadPoolExecutor:替代AsyncTaskAndroid切換到主線程更新UI的簡(jiǎn)化方法view.post(Runnable)view.postDelayed(Runnable,Object,long)view.postAtTime(Runnable,long)activity.runOnUiThread(Runnable)2026/2/10第7章Android網(wǎng)絡(luò)編程67Handler背景:Android開(kāi)發(fā)規(guī)定只允許UI線程更新Activity中的UI組件在實(shí)際開(kāi)發(fā)中,存在多個(gè)線程并發(fā)操作UI組件的情況,導(dǎo)致UI操作的線程不安全解決方案:Handler的消息傳遞機(jī)制工作線程需要更新UI時(shí),通過(guò)Handler通知主線程,從而在主線程更新UI操作,實(shí)現(xiàn)異步消息的處理2026/2/10第7章Android網(wǎng)絡(luò)編程68Handler提供Android的消息傳遞機(jī)制作用:在多線程的應(yīng)用場(chǎng)景中,將工作線程中需更新UI的操作信息傳遞到UI主線程,從而實(shí)現(xiàn)工作線程對(duì)UI的更新處理,最終實(shí)現(xiàn)異步消息的處理。工作流程:異步通信準(zhǔn)備:在主線程中創(chuàng)建Handler對(duì)象消息發(fā)送:通過(guò)Handler發(fā)送消息消息循環(huán):消息分發(fā)消息處理:Handler根據(jù)消息進(jìn)行UI操作2026/2/10第7章Android網(wǎng)絡(luò)編程69Handler的執(zhí)行流程2026/2/10第7章Android網(wǎng)絡(luò)編程70Handler涉及的概念概念定義作用備注主線程(UI線程)當(dāng)應(yīng)用程序第1次啟動(dòng)時(shí),會(huì)同時(shí)自動(dòng)開(kāi)啟1條主線程處理與UI相關(guān)的事件,如更新、操作等主線程與子線程的通信媒介=Handler子線程(工作線程)人為手動(dòng)開(kāi)啟的線程執(zhí)行耗時(shí)操作,如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)加載等消息(Message)線程間通訊的數(shù)據(jù)單元,即Handler接受和處理的消息對(duì)象存儲(chǔ)需操作的通信信息消息隊(duì)列(MessageQueue)一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)Handler發(fā)送過(guò)來(lái)的消息Message處理者(Handler)主線程與子線程的通信媒介線程消息的主要處理者添加消息到消息隊(duì)列循環(huán)器分派過(guò)來(lái)的消息循環(huán)器(Looper)消息隊(duì)列與處理者的通信媒介消息循環(huán),即:消息獲?。貉h(huán)取出消息隊(duì)列的消息消息分發(fā):將取出的消息發(fā)送給對(duì)應(yīng)的處理者每個(gè)線程中只能有1個(gè)Looper1個(gè)Looper可綁定多個(gè)線程的Handler2026/2/10第7章Android網(wǎng)絡(luò)編程71Handler涉及的對(duì)象Message類(lèi):表示要傳遞的一個(gè)消息MessageQueue類(lèi):存放消息對(duì)象的消息隊(duì)列,先進(jìn)先出原則Looper類(lèi):負(fù)責(zé)管理當(dāng)前新城的消息對(duì)象MessageQueueHandler類(lèi):負(fù)責(zé)把消息push到消息隊(duì)列,并接收Looper從消息隊(duì)列中取出的消息Android啟動(dòng)后會(huì)在UI線程創(chuàng)建一個(gè)MessageQueue隊(duì)列2026/2/10第7章Android網(wǎng)絡(luò)編程72Message對(duì)象獲取消息對(duì)象Message.obtain():靜態(tài)方法,從消息池獲取一個(gè)Message對(duì)象,如果消息池是空的,則實(shí)例化一個(gè)新的Message對(duì)象,消息的上限是10個(gè),這樣使得消息資源能重復(fù)利用handler.obtainMessage():實(shí)例方法,具有多個(gè)重載方法,其內(nèi)部實(shí)現(xiàn)也是調(diào)用Message.obtain()設(shè)置、獲取數(shù)據(jù)復(fù)雜數(shù)據(jù):setData(bundle)、getData()簡(jiǎn)單數(shù)據(jù):msg.obj傳遞一個(gè)任意的對(duì)象、msg.arg1和msg.arg2分別傳遞一個(gè)int值msg.what:定義的消息碼,用于設(shè)定消息的標(biāo)志2026/2/1073第7章Android網(wǎng)絡(luò)編程Handler編程新建Handler子類(lèi)的方式創(chuàng)建Handler子類(lèi)繼承于Handler類(lèi),重寫(xiě)handleMessage()方法在Activity中創(chuàng)建Handler對(duì)象實(shí)例在工作線程中創(chuàng)建所需的Message消息對(duì)象在工作線程中通過(guò)Handler對(duì)象發(fā)送消息到消息隊(duì)列中,方法有:sendMessage()、sendMessageDelayed()、sendEmptyMessage()、sendEmptyMessageDelayed()、sendMessageAtTime()開(kāi)啟工作線程案例:D0701_MultiThread2026/2/10第7章Android網(wǎng)絡(luò)編程74Handler發(fā)送消息的方法voidhandleMessage(Messagemsg):處理消息的方法,通常是用于被重寫(xiě)發(fā)送消息
sendEmptyMessage(intwhat):發(fā)送空消息sendEmptyMessageDelayed(intwhat,longdelayMillis):指定延時(shí)多少毫秒后發(fā)送空信息sendMessage(Messagemsg):立即發(fā)送信息sendMessageDelayed(Messagemsg,longdelayMillis):指定延時(shí)多少毫秒后發(fā)送信息hasMessage(intwhat):檢查消息隊(duì)列中是否包含what屬性為指定值的消息post(Runnabler)postAtTime(Runnabler,longuptimeMillis)postDelayed(Runnabler,longdelayMillis)注意:如果是參數(shù)為(intwhat,Objectobject):除了判斷what屬性,還需要判斷Object屬性是否為指定對(duì)象的消息2026/2/10第7章Android網(wǎng)絡(luò)編程75ThreadPoolExecutor線程池技術(shù)2026/2/10第7章Android網(wǎng)絡(luò)編程76ThreadPoolExecutor使用ThreadPoolExecutor的基本步驟包括:創(chuàng)建任務(wù)類(lèi),重寫(xiě)run()方法使用Executors的工廠方法創(chuàng)建線程池向線程池提交任務(wù)關(guān)閉線程池案例:D0701_MultiThread2026/2/10第7章Android網(wǎng)絡(luò)編程777.2WebView782026/2/10第7章Android網(wǎng)絡(luò)編程WebView控件WebView控件:加載HTML5頁(yè)面使用WebView控件布局中使用<WebView>調(diào)用WebView的loadUrl()加載頁(yè)面調(diào)用WebView的setWebViewClient()方法,通過(guò)重寫(xiě)WebViewClient對(duì)象的showOverrideUrlLoading()方法實(shí)現(xiàn)在當(dāng)前界面加載網(wǎng)頁(yè),而不是跳轉(zhuǎn)到瀏覽器打開(kāi)2026/2/10第7章Android網(wǎng)絡(luò)編程79加載網(wǎng)頁(yè)或數(shù)據(jù)loadUrl(Stringurl):加載網(wǎng)頁(yè)loadData(Stringdata,StringmimeType,Stringencoding):加載html片段操作網(wǎng)頁(yè)canGoBack():是否可以后退goBack()/goForward():回退/前進(jìn)goBackOrFOrward():前進(jìn)或回退指定的位置案例:D0702_WebView第7章Android網(wǎng)絡(luò)編程80WebView類(lèi)的方法AsyncTask–自學(xué)Android已封裝好的輕量級(jí)異步類(lèi)(Android11被棄用)作用實(shí)現(xiàn)多線程,在工作線程中執(zhí)行耗時(shí)任務(wù)實(shí)現(xiàn)工作線程與主線程(UI線程)之間的通信,保證線程安全優(yōu)點(diǎn)簡(jiǎn)單、方便,無(wú)需使用"任務(wù)線程+Handler"的復(fù)雜組合節(jié)省資源,采用線程池的緩存線程+復(fù)用線程2026/2/10第7章Android網(wǎng)絡(luò)編程81AsyncTask工作流程2026/2/10第7章Android網(wǎng)絡(luò)編程82小結(jié)多線程的基本概念創(chuàng)建多線程的方法Handler消息傳遞ThreadPoolExecutor線程池2026/2/1083第7章Android網(wǎng)絡(luò)編程提問(wèn)時(shí)間2026/2/10第7章Android網(wǎng)絡(luò)編程84待續(xù)…網(wǎng)絡(luò)編程85多媒體開(kāi)發(fā)第8章學(xué)習(xí)目標(biāo)了解多媒體的基本概念掌握Android音視頻的播放方法(★)掌握Android三種動(dòng)畫(huà)的使用方法(★)理解各種動(dòng)畫(huà)的應(yīng)用場(chǎng)景2026/2/10第8章多媒體開(kāi)發(fā)87內(nèi)容大綱多媒體的基本概念音、視頻播放動(dòng)畫(huà)和過(guò)渡2026/2/10第8章多媒體開(kāi)發(fā)88上次課回顧HttpURLConnection網(wǎng)絡(luò)請(qǐng)求的過(guò)程Gson如何解析JSON字符串什么是OkHttp框架2026/2/1089第8章多媒體開(kāi)發(fā)8.1多媒體簡(jiǎn)介
902026/2/10第8章多媒體開(kāi)發(fā)多媒體的概念多媒體:Multimedia,文本、聲音、圖片、動(dòng)畫(huà)、視頻……計(jì)算機(jī)系統(tǒng)的定義兩種或兩種以上資源組合的一種人機(jī)交互式信息交流和傳播媒體涉及了硬件抽象層、編解碼、底層多媒體框架、Android多媒體框架和應(yīng)用層接口等Android多媒體應(yīng)用的開(kāi)發(fā),包括:音頻Audio和視頻Video的播放、動(dòng)畫(huà)過(guò)渡支持的圖片格式:JPEG、GIF、PNG和BMP。支持的音頻格式:3GP、MP3和WAV支持的視頻格式:3GP、MP42026/2/10第8章多媒體開(kāi)發(fā)91Android多媒體接口MediaPlayer類(lèi):播放聲音、視頻的API,提供獲取、解碼和播放等功能AudioManager類(lèi):管理設(shè)備上的音頻源和音頻輸出MediaRecorder:提供音頻、視頻錄制等AudioRecord:提供音頻的錄音接口,默認(rèn)編碼為PCM_16_BITSoundPool:提供幾種聲音同時(shí)播放的功能,適用于游戲場(chǎng)景Ringtone:提供系統(tǒng)自帶的聲音文件的播放功能,適用于系統(tǒng)提示音VideoView:播放視頻Camera:拍照和錄像2026/2/10第8章多媒體開(kāi)發(fā)928.2音頻播放MediaPlayer類(lèi)MeadiaPlayer類(lèi)提供獲取、解碼以及播放音頻和視頻的API支持多種不同的媒體源,如:本地資源、內(nèi)部URI資源、外部或網(wǎng)絡(luò)資源2026/2/10第8章多媒體開(kāi)發(fā)94使用MediaPlayer實(shí)現(xiàn)步驟實(shí)例化MediaPlayer類(lèi),加載或設(shè)置數(shù)據(jù)源準(zhǔn)備播放播放或暫停播放停止播放釋放資源案例:D0801_MusicPlayer2026/2/10第8章多媒體開(kāi)發(fā)95加載音頻文件的方法類(lèi)方法creat(Context,Uri):從URI來(lái)裝載音頻文件,返回MediaPlayer對(duì)象creat(Context,resid):從res資源獲取id對(duì)應(yīng)的資源文件中裝載音頻文件,返回MediaPlayer對(duì)象實(shí)例方法setDataSource(String):從本地、SD卡或網(wǎng)絡(luò)加載數(shù)據(jù)文件來(lái)源raw資源:R.raw.test本地文件:setDataSource("sdcard/test.mp3")網(wǎng)絡(luò)URL文件:setDataSource("/music/test.mp3")2026/2/10第8章多媒體開(kāi)發(fā)96音頻播放相關(guān)的方法start():開(kāi)始或者恢復(fù)播放pause():暫停播放reset():重置為初始狀態(tài)seekTo():拖曳進(jìn)度stop():停止播放release():釋放資源2026/2/10第8章多媒體開(kāi)發(fā)97MediaPlayer的方法事件監(jiān)聽(tīng)器setOnCompletionListener():播放完成的事件監(jiān)聽(tīng)setOnErrorListener():播放錯(cuò)誤的事件監(jiān)聽(tīng)setOnPreparedListener():prepare方法的事件監(jiān)聽(tīng)setOnSeekCompleteListener():seek方法的事件監(jiān)聽(tīng)其它方法isPlaying():是否在播放getDuration():獲取音頻時(shí)長(zhǎng),單位:毫秒getCurrentPosition():獲取當(dāng)前的播放進(jìn)度2026/2/10第8章多媒體開(kāi)發(fā)98MediaPlayer的狀態(tài)轉(zhuǎn)換2026/2/10第8章多媒體開(kāi)發(fā)99MediaPlayer的狀態(tài)轉(zhuǎn)換狀態(tài)轉(zhuǎn)換的注意點(diǎn)Started->Paused->Stopped的轉(zhuǎn)換是單向的Initialized狀態(tài)需要裝載數(shù)據(jù),才可以調(diào)用start()播放End、Error狀態(tài)游離在其他狀態(tài)之外,在任何狀態(tài)皆可切換2026/2/10第8章多媒體開(kāi)發(fā)1008.3視頻播放播放視頻MediaPlayer既可以播放音頻,也能播放視頻,但無(wú)法提供視頻圖像的輸出視頻輸出的控件VideoView:最簡(jiǎn)單的視頻播放方式,支持:mp4、avi、3gb等格式的視頻SurfaceView:提供一個(gè)獨(dú)立的繪圖Surface嵌入到視圖結(jié)構(gòu)層次中,用于輸出視頻圖像2026/2/10第8章多媒體開(kāi)發(fā)102使用VideoView播放視頻Android通過(guò)VideoView組件進(jìn)行視頻的播放,步驟如下:在界面布局中定義VideoView組件,或通過(guò)java代碼定義調(diào)用VideoView的方法加載視頻setVideoPath(Stringpath):加載視頻文件setVideoURI(Uriuri):加載uri所對(duì)應(yīng)的視頻調(diào)用VideoView的start()、pause()、stop()等方法控制視頻的播放案例:D0802_VideoPlayer2026/2/10第8章多媒體開(kāi)發(fā)103使用SurfaceViewSurfaceView繼承自View,但與普通View有較大區(qū)別SurfaceView提供的獨(dú)立的繪圖Surface可以在獨(dú)立的線程中渲染,而不占用主線程資源SurfaceView的雙緩沖技術(shù)也能有效解決反復(fù)局部刷新帶來(lái)的閃爍問(wèn)題,后臺(tái)緩沖區(qū)接受數(shù)據(jù),當(dāng)繪制完整后提交到前臺(tái)緩沖區(qū)顯示,提高渲染效率和刷新速度應(yīng)用場(chǎng)景:廣泛用于游戲開(kāi)發(fā)中,如繪制游戲背景、動(dòng)畫(huà)等復(fù)雜UI界面2026/2/10第8章多媒體開(kāi)發(fā)104SurfaceView的工作原理2026/2/10第8章多媒體開(kāi)發(fā)105使用SurfaceView開(kāi)發(fā)流程在布局中使用SurfaceView控件使用SurfaceView的getHolder()方法獲得SurfaceHolder對(duì)象通過(guò)SurfaceHolder對(duì)象設(shè)置圖像的分辨率和Callback接口重寫(xiě)Callback接口的surfaceCreated、surfaceChanged和surfaceDestroyed這三個(gè)方法SurfaceView提供了兩個(gè)線程:UI線程和渲染線程,在使用過(guò)程中需要注意以下兩點(diǎn):SurfaceView和SurfaceHolder.Callback的方法都應(yīng)在UI主線程調(diào)用;要確保渲染線程訪問(wèn)的是合法有效的Surface案例:D0802_VideoPlayer2026/2/10第8章多媒體開(kāi)發(fā)1068.4動(dòng)畫(huà)和過(guò)渡2026/2/10第8章多媒體開(kāi)發(fā)107動(dòng)畫(huà)分類(lèi)視圖動(dòng)畫(huà):作用于View控件逐幀動(dòng)畫(huà)FrameAnimation:順序播放一系列圖片產(chǎn)生動(dòng)畫(huà)效果補(bǔ)間動(dòng)畫(huà)TweenAnimation:通過(guò)對(duì)場(chǎng)景中的View不斷做漸變、旋轉(zhuǎn)、縮放或平移等變換產(chǎn)生動(dòng)畫(huà)效果屬性動(dòng)畫(huà):作用于任意Java對(duì)象補(bǔ)間動(dòng)畫(huà)的增強(qiáng)版,通過(guò)動(dòng)態(tài)改變對(duì)象的屬性達(dá)到動(dòng)畫(huà)效果2026/2/10第8章多媒體開(kāi)發(fā)108實(shí)現(xiàn)動(dòng)畫(huà)的方法XML方式/res/anim設(shè)置動(dòng)畫(huà):alpha、scale、translate、rotate調(diào)用AnimationUtils.loadAnimation()加載xml動(dòng)畫(huà),調(diào)用startAnimation()方法啟動(dòng)動(dòng)畫(huà)編碼方式動(dòng)態(tài)創(chuàng)建動(dòng)畫(huà)對(duì)象,設(shè)置動(dòng)畫(huà)參數(shù),然后調(diào)用startAnimation()啟動(dòng)動(dòng)畫(huà),透明度動(dòng)畫(huà)類(lèi)為AlphaAnimation、縮放動(dòng)畫(huà)類(lèi)為ScaleAnimation、位移動(dòng)畫(huà)類(lèi)為T(mén)ranslateAnimation、旋轉(zhuǎn)動(dòng)畫(huà)類(lèi)為RotateAnimation2026/2/10第8章多媒體開(kāi)發(fā)109逐幀動(dòng)畫(huà)原理將動(dòng)畫(huà)拆分為幀的形式,且定義每一幀=每一張圖片逐幀動(dòng)畫(huà)的本質(zhì):按序播放一組預(yù)先定義好的圖片應(yīng)用場(chǎng)景較為復(fù)雜的個(gè)性化動(dòng)畫(huà)效果與補(bǔ)間動(dòng)畫(huà)類(lèi)似,也是作用于UI控件特點(diǎn)使用簡(jiǎn)單、方便容易引起OutOfMemory,避免使用尺寸較大的圖片2026/2/10第8章多媒體開(kāi)發(fā)110使用逐幀動(dòng)畫(huà)步驟將動(dòng)畫(huà)資源(即每張圖片資源)放到drawable文件夾里在布局中設(shè)置動(dòng)畫(huà)或通過(guò)編碼啟動(dòng)動(dòng)畫(huà)案例:D0803_Animation2026/2/10第8章多媒體開(kāi)發(fā)111插值器和估值器插值器Interpolator接口設(shè)置屬性值從初始值過(guò)渡到結(jié)束值的變化規(guī)律用于實(shí)現(xiàn)非線性運(yùn)動(dòng)的動(dòng)畫(huà)效果在動(dòng)畫(huà)設(shè)置xml中使用android:interpolator估值器TypeEvaluator接口設(shè)置屬性值從初始值過(guò)渡到結(jié)束值的變化的具體數(shù)值協(xié)助插值器實(shí)現(xiàn)非線性運(yùn)動(dòng)的動(dòng)畫(huà)效果使用ObjectAnimator.ofObject()方法設(shè)置2026/2/10第8章多媒體開(kāi)發(fā)112補(bǔ)間動(dòng)畫(huà)原理通過(guò)確定開(kāi)始和結(jié)束的視圖樣式,中間動(dòng)畫(huà)變化由系統(tǒng)補(bǔ)全來(lái)確定一個(gè)動(dòng)畫(huà)如:平移、縮放、旋轉(zhuǎn)和透明度類(lèi)型平移動(dòng)畫(huà)Translate:移動(dòng)視圖的位置,TranslateAnimation類(lèi)縮放動(dòng)畫(huà)Scale:放大/縮小視圖的大小,ScaleAnimation類(lèi)旋轉(zhuǎn)動(dòng)畫(huà)Rotate:旋轉(zhuǎn)視圖的角度,RotateAnimation類(lèi)透明度動(dòng)畫(huà)Alpha:改變視圖的透明度,AlphaAnimation類(lèi)2026/2/10第8章多媒體開(kāi)發(fā)113補(bǔ)間動(dòng)畫(huà)應(yīng)用場(chǎng)景視圖中,標(biāo)準(zhǔn)、基礎(chǔ)的動(dòng)畫(huà)效果Activity、Fragment的切換效果視圖組ViewGroup中子元素的出場(chǎng)效果特點(diǎn)使用簡(jiǎn)單、方便僅控制整體實(shí)體效果,無(wú)法控制屬性2026/2/10第8章多媒體開(kāi)發(fā)114使用補(bǔ)間動(dòng)畫(huà)步驟在res/anim目錄創(chuàng)建動(dòng)畫(huà)效果xml文件根據(jù)不同動(dòng)畫(huà)效果的語(yǔ)法,設(shè)置不同的動(dòng)畫(huà)參數(shù)在java類(lèi)中創(chuàng)建Animation對(duì)象,播放動(dòng)畫(huà);或者在java類(lèi)中創(chuàng)建動(dòng)畫(huà)對(duì)象并播放案例:D0803_Animation2026/2/10第8章多媒體開(kāi)發(fā)115xml元素與Java類(lèi)的關(guān)系XML元素Java類(lèi)功能描述<translate>TranslateAnimation位移動(dòng)畫(huà)<scale>ScaleAnimation縮放動(dòng)畫(huà)<rotate>RotateAnimation旋轉(zhuǎn)動(dòng)畫(huà)<alpha>AlphaAnimation漸變透明度動(dòng)畫(huà)<set>AnimationSet多種動(dòng)畫(huà)的組合2026/2/10第8章多媒體開(kāi)發(fā)116補(bǔ)間動(dòng)畫(huà)的公共屬性duration:動(dòng)畫(huà)持續(xù)時(shí)間(ms),必須設(shè)置,動(dòng)畫(huà)才有效果startOffset:動(dòng)畫(huà)之間的時(shí)間間隔(ms)fillBefore:設(shè)置為true,動(dòng)畫(huà)轉(zhuǎn)化開(kāi)始前被應(yīng)用,默認(rèn)為truefillAfter:設(shè)置為true,動(dòng)畫(huà)轉(zhuǎn)化在動(dòng)畫(huà)結(jié)束后被應(yīng)用,默認(rèn)為falsefillEnabled:是否應(yīng)用fillBefore值,對(duì)fillAfter值無(wú)影響,默認(rèn)為truerepeatMode:選擇重復(fù)播放動(dòng)畫(huà)模式,restart正序重放,reverse倒序回放,默認(rèn)為restartrepeatCount:重放次數(shù)(動(dòng)畫(huà)的播放次數(shù)=重放次數(shù)+1),infinite無(wú)限重復(fù)interpolator:插值器,即影響動(dòng)畫(huà)的播放速度2026/2/10第8章多媒體開(kāi)發(fā)117位移動(dòng)畫(huà)常用屬性android:fromXDelta="0"
視圖在水平方向x移動(dòng)的起始值android:fromYDelta="0%p"
視圖在水平方向y移動(dòng)的起始值android:toXDelta="500"
視圖在水平方向x移動(dòng)的結(jié)束值android:toYDelta="-100%p"
視圖在水平方向y移動(dòng)的結(jié)束值數(shù)字:?jiǎn)挝粸橄袼匕俜直龋合鄬?duì)于控件寬度或高度的百分比百分比+p:相對(duì)于控件的父控件的百分比正負(fù)號(hào):負(fù)值上移,正值下移2026/2/10第8章多媒體開(kāi)發(fā)118縮放動(dòng)畫(huà)相應(yīng)的屬性android:fromXScale="0.0":動(dòng)畫(huà)在X方向的起始縮放倍數(shù)android:toXScale="2":動(dòng)畫(huà)在X方向的結(jié)束縮放倍數(shù)android:fromYScale="0.0":動(dòng)畫(huà)在Y方向的起始縮放倍數(shù)android:toYScale="2":動(dòng)畫(huà)在Y方向的結(jié)束縮放倍數(shù)android:pivotX="50":縮放縮放中心點(diǎn)的x坐標(biāo),可取值為數(shù)字,百分比,或者百分比+pandroid:pivotY="50":縮放縮放中心點(diǎn)的y坐標(biāo)pivotX、pivotY的取值數(shù)字:軸點(diǎn)為View的左上角的原點(diǎn)在x方向和y方向加上50px的點(diǎn)百分比:軸點(diǎn)為View的左上角的原點(diǎn)在x方向加上自身寬度50%和y方向自身高度50%的點(diǎn)百分比p:軸點(diǎn)為View的左上角的原點(diǎn)在x方向加上父控件寬度50%和y方向父控件高度50%的點(diǎn)軸點(diǎn):視圖縮放的中心點(diǎn)2026/2/10第8章多媒體開(kāi)發(fā)119旋轉(zhuǎn)動(dòng)畫(huà)相應(yīng)的屬性android:fromDegrees="0":動(dòng)畫(huà)開(kāi)始時(shí),視圖的旋轉(zhuǎn)角度(正數(shù):順時(shí)針,負(fù)數(shù):逆時(shí)針)android:toDegrees="270":動(dòng)畫(huà)結(jié)束時(shí),視圖的旋轉(zhuǎn)角度android:pivotX="50%":旋轉(zhuǎn)軸點(diǎn)的x坐標(biāo)(軸點(diǎn):視圖縮放的中心點(diǎn))android:pivotY="0":
旋轉(zhuǎn)軸點(diǎn)的y坐標(biāo)2026/2/10第8章多媒體開(kāi)發(fā)120透明度動(dòng)畫(huà)相應(yīng)屬性android:fromAlpha="1.0":動(dòng)畫(huà)開(kāi)始時(shí)視圖的透明度(取值范圍-1~1)android:toAlpha="0.0":動(dòng)畫(huà)結(jié)束時(shí)視圖的透明度(取值范圍-1~1)2026/2/10第8章多媒體開(kāi)發(fā)121動(dòng)畫(huà)的事件監(jiān)聽(tīng)loadAnimation.setAnimationListener(newAnimation.AnimationListener(){
@Override
publicvoidonAnimationStart(Animationanimation){
}
@Override
publicvoidonAnimationEnd(Animationanimation){
}
@Override
publicvoidonAnimationRepeat(Animationanimation){
}
});2026/2/10第8章多媒體開(kāi)發(fā)122屬性動(dòng)畫(huà)屬性動(dòng)畫(huà)(PropertyAnimation)是在Android3.0后提供的一種全新動(dòng)畫(huà)模式,針對(duì)視圖動(dòng)畫(huà)的局限性和動(dòng)畫(huà)效果單一等缺點(diǎn)原理在一定時(shí)間間隔內(nèi),通過(guò)不斷對(duì)值進(jìn)行改變,不斷將該值賦給對(duì)象的屬性,實(shí)現(xiàn)動(dòng)畫(huà)效果可以是任意對(duì)象的任意屬性特點(diǎn)作用對(duì)象進(jìn)行了擴(kuò)展,不只是View對(duì)象動(dòng)畫(huà)效果豐富,不只是4種基本變換,還有其它的動(dòng)畫(huà)效果應(yīng)用場(chǎng)景:與屬性相關(guān)、更加復(fù)雜的動(dòng)畫(huà)效果2026/2/10第8章多媒體開(kāi)發(fā)123屬性動(dòng)畫(huà)2026/2/10第8章多媒體開(kāi)發(fā)124使用類(lèi)作用備注ValueAnimator先改變值,然后手動(dòng)賦值給對(duì)象的屬性(間接賦值)本質(zhì)是值的操作機(jī)制ObjectAnimator先改變值,然后自動(dòng)賦值給對(duì)象的屬性(直接賦值)采用get()&set()進(jìn)行自動(dòng)賦值A(chǔ)nimatorSet實(shí)現(xiàn)組合動(dòng)畫(huà)ViewPropertyAnimator采用對(duì)對(duì)象操作addListener()動(dòng)畫(huà)監(jiān)聽(tīng)器,監(jiān)聽(tīng)動(dòng)畫(huà)開(kāi)始/結(jié)束/取消/重復(fù)時(shí)刻可采用動(dòng)畫(huà)適配器(AnimatorListenerAdapter)按需監(jiān)聽(tīng)動(dòng)畫(huà)時(shí)刻屬性動(dòng)畫(huà)的自定義屬性時(shí)長(zhǎng)(Duration):指定動(dòng)畫(huà)總共完成所需要的時(shí)間,默認(rèn)為300毫秒時(shí)間插值器(TimeInterpolator):基于當(dāng)前動(dòng)畫(huà)已消耗時(shí)間的函數(shù),用于計(jì)算屬性值重復(fù)計(jì)數(shù)(RepeatCount):指定動(dòng)畫(huà)是否重復(fù)執(zhí)行以及執(zhí)行次數(shù),也可以指定動(dòng)畫(huà)向反方向回退操作動(dòng)畫(huà)集(AnimatorSet):定義一組動(dòng)畫(huà),設(shè)置同時(shí)執(zhí)行或者順序執(zhí)行延遲刷新時(shí)間(Framerefreshdelay):指定動(dòng)畫(huà)的刷新頻率,默認(rèn)為每10ms刷新一幀,但真實(shí)的刷新頻率取決于整個(gè)系統(tǒng)的運(yùn)行狀態(tài)2026/2/10第8章多媒體開(kāi)發(fā)125屬性動(dòng)畫(huà)的運(yùn)行機(jī)制通過(guò)不斷改變View的屬性值實(shí)現(xiàn)的,具體步驟包括:通過(guò)get()方法獲取目標(biāo)對(duì)象的屬性值;調(diào)用時(shí)間插值器方法修改屬性值;調(diào)用set()方法更改目標(biāo)對(duì)象的屬性值,達(dá)到動(dòng)畫(huà)效果。2026/2/10第8章多媒體開(kāi)發(fā)126ValueAnimator類(lèi)屬性動(dòng)畫(huà)機(jī)制最核心的類(lèi)通過(guò)不斷控制值的變化,再不斷手動(dòng)賦給對(duì)象的屬性,從而實(shí)現(xiàn)動(dòng)畫(huà)效果ValueAnimator類(lèi)的方法ValueAnimator.ofInt(int…values):將初始值以整型數(shù)值的形式過(guò)渡到結(jié)束值ValueAnimator.ofFloat(floatvalues):將初始值以浮點(diǎn)型數(shù)值的形式過(guò)渡到結(jié)束值ValueAnimator.ofObject(intvalues):將初始值以對(duì)象的形式過(guò)渡到結(jié)束值2026/2/10第8章多媒體開(kāi)發(fā)127使用屬性動(dòng)畫(huà)編碼實(shí)現(xiàn)屬性動(dòng)畫(huà)的步驟設(shè)置ValueAnimator對(duì)象的初始值和結(jié)束值設(shè)置動(dòng)畫(huà)播放的各種屬性通過(guò)動(dòng)畫(huà)更新監(jiān)聽(tīng)器AnimatorUpdateListener將屬性值手動(dòng)賦值給對(duì)象的屬性將改變的值賦給對(duì)象的屬性屬性對(duì)象視圖啟動(dòng)動(dòng)畫(huà)案例:D0803_Animation2026/2/10第8章多媒體開(kāi)發(fā)128使用屬性動(dòng)畫(huà)xml實(shí)現(xiàn)屬性動(dòng)畫(huà)的步驟在/res/animator文件夾創(chuàng)建xml設(shè)置動(dòng)畫(huà)屬性在java類(lèi)中啟動(dòng)動(dòng)畫(huà)案例:D0803_Animation2026/2/10第8章多媒體開(kāi)發(fā)129內(nèi)置插值器插值器類(lèi)名稱(chēng)含義描述AccelerateDecelerateInterpolator變化率開(kāi)始和結(jié)束時(shí)緩慢,中間階段加快AccelerateInterpolator變化率加速度變化AnticipateInterpolator先反向變化,然后再急速正向變化AnticipateOvershootInterpolator插先反向變化,再急速正向變化,然后超過(guò)設(shè)定值,最后返回到最終值BounceInterpolator變化率在結(jié)束時(shí)回彈CycleInterpolator在指定數(shù)量的周期內(nèi)循環(huán)DecelerateInterpolator變化率減速變化,與AccelerateInterpolator相反LinearInterpolator變化率恒定不變,勻速變化OvershootInterpolator急速正向變化,超出最終值后返回TimeInterpolator插值器的父接口,用于實(shí)現(xiàn)自定義的插值器2026/2/10第8章多媒體開(kāi)發(fā)130ObjectAnimatorObjectAnimator是ValueAnimator的子類(lèi),可以直接對(duì)對(duì)象的屬性進(jìn)行動(dòng)畫(huà)操作,簡(jiǎn)化為對(duì)象添加動(dòng)畫(huà)的過(guò)程與ValueAnimator的區(qū)別ValueAnimator類(lèi)是先改變值,然后手動(dòng)賦值給對(duì)象的屬性實(shí)現(xiàn)動(dòng)畫(huà),間接對(duì)對(duì)象屬性進(jìn)行操作ObjectAnimator類(lèi)是先改變值,然后自動(dòng)賦值給對(duì)象的屬性實(shí)現(xiàn)動(dòng)畫(huà),直接對(duì)對(duì)象屬性進(jìn)行操作2026/2/10第8章多媒體開(kāi)發(fā)1312026/2/10第8章多媒體開(kāi)發(fā)132ObjectAnimator相關(guān)屬性屬性名稱(chēng)對(duì)應(yīng)的set方法含義描述alphasetAlpha(float)控制View的透明度translationXsetTranslationX(float)控制X方向的位移translationYsetTranslationY(float)控制Y方向的位移scaleXsetScaleX(float)控制X方向的縮放比例scaleYsetScaleY(float)控制Y方向的縮放比例rotationXsetRotationX(float)控制以X為軸的旋轉(zhuǎn)度數(shù)rotationYsetRot
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 某公司員工培訓(xùn)
- 2024-2025學(xué)年江西省“三新”協(xié)同教研共同體高二下學(xué)期5月聯(lián)考?xì)v史試題(解析版)
- 2026年網(wǎng)絡(luò)信息安全知識(shí)與應(yīng)對(duì)能力考查題集
- 2026年語(yǔ)言學(xué)習(xí)考試漢語(yǔ)言文化基礎(chǔ)試題
- 2026年汽車(chē)制造汽車(chē)工程師招聘面試題集與汽車(chē)工藝知識(shí)問(wèn)答
- 2026年計(jì)算機(jī)網(wǎng)絡(luò)安全防護(hù)措施考試題
- 2026年金融科技產(chǎn)品創(chuàng)新與市場(chǎng)需求分析題庫(kù)
- 2026年公共關(guān)系與危機(jī)處理能力測(cè)試題目
- 2026年知識(shí)產(chǎn)權(quán)保護(hù)試題侵權(quán)行為與法律責(zé)任分析題庫(kù)
- 2026年AI與自然語(yǔ)言處理測(cè)試題
- 依法行醫(yī)教學(xué)課件
- 《日語(yǔ)零基礎(chǔ)學(xué)習(xí)》課件
- 講課學(xué)生數(shù)學(xué)學(xué)習(xí)成就
- 醫(yī)療器械法規(guī)對(duì)互聯(lián)網(wǎng)銷(xiāo)售的限制
- 西葫蘆栽培技術(shù)要點(diǎn)
- 系桿拱橋系桿預(yù)應(yīng)力施工控制要點(diǎn)
- 高中學(xué)生學(xué)籍表模板(范本)
- 三亞市海棠灣椰子洲島土地價(jià)格咨詢報(bào)告樣本及三洲工程造價(jià)咨詢有限公司管理制度
- 常見(jiàn)磁性礦物的比磁化系數(shù)一覽表
- 高中心理健康教育-給自己點(diǎn)個(gè)贊教學(xué)課件設(shè)計(jì)
- 薪酬管理論文參考文獻(xiàn),參考文獻(xiàn)
評(píng)論
0/150
提交評(píng)論