




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《騰訊1+x安卓應(yīng)用開(kāi)發(fā)(中級(jí))》教案
一、教案設(shè)計(jì)課題項(xiàng)目1任務(wù)1Kotlin簡(jiǎn)介及開(kāi)發(fā)環(huán)境搭建課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)1課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)1.能夠進(jìn)行Kotlin安裝包的下載與安裝。2.能夠進(jìn)行Kotlin環(huán)境的搭建與配置。教學(xué)重點(diǎn)Kotlin泛型、Kotlin的反射、Kotlin中的協(xié)程。教學(xué)難點(diǎn)Kotlin的反射。教學(xué)內(nèi)容1.Kotlin簡(jiǎn)介Kotlin是JetBrains公司在2010年推出的一種基于JVM的靜態(tài)類型編程語(yǔ)言。Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript,以便在沒(méi)有JVM的設(shè)備上運(yùn)行。2017年,Google宣布Kotlin是Android官方開(kāi)發(fā)語(yǔ)言。2.Kotlin在安卓開(kāi)發(fā)時(shí)的優(yōu)勢(shì)使用Kotlin語(yǔ)言,對(duì)于安卓開(kāi)發(fā)來(lái)說(shuō),主要有下面幾個(gè)優(yōu)勢(shì)。減少空指針異常。減少代碼量:同樣的功能Kotlin開(kāi)發(fā)要比Java少50%甚至更多。提升開(kāi)發(fā)效率:增加了許多現(xiàn)代高級(jí)語(yǔ)言的語(yǔ)法特性,使得開(kāi)發(fā)效率大大提升。實(shí)現(xiàn)與Java語(yǔ)言的無(wú)縫連接:Kotlin可以直接調(diào)用和使用Java編寫的代碼,也可以無(wú)縫使用Java第三方開(kāi)源庫(kù)3.Kotlin插件的安裝在AndroidStudio中安裝Kotlin開(kāi)發(fā)環(huán)境,需要先安裝Kotlin插件,安裝步驟如下:(1)單擊File|Setting,彈出setting面板,如圖1-1-1所示。圖1-1-1setting面板(2)單擊Plugins,輸入kotlin進(jìn)行搜索,如圖1-1-2。圖1-1-2搜索kotlin(3)單擊Install后等待安裝完成即可。教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】為什么需要安裝Kotlin插件?默認(rèn)情況下,AndroidStudio安裝完成后,還不能使用Kotlin編寫代碼。要想使用Kotlin,必須安裝Kotlin插件?!窘虒W(xué)實(shí)施】6.2.1任務(wù)描述在AndroidStudio中安裝Kotlin插件,搭建Kotlin開(kāi)發(fā)環(huán)境,以便能在AndroidStudio中使用Kotlin編寫代碼。6.2.2問(wèn)題引導(dǎo)為什么需要安裝Kotlin插件?默認(rèn)情況下,AndroidStudio安裝完成后,還不能使用Kotlin編寫代碼。要想使用Kotlin,必須安裝Kotlin插件。6.1.3知識(shí)準(zhǔn)備Kotlin是一種基于JVM的靜態(tài)類型編程語(yǔ)言。Kotlin是Android官方開(kāi)發(fā)語(yǔ)言。使用Kotlin語(yǔ)言進(jìn)行安卓開(kāi)發(fā)的優(yōu)勢(shì)。6.1.4在線安裝Kotlin插件6.1.5知識(shí)拓展下載安裝Kotlin插件離線安裝Kotlin插件【知識(shí)(技能)鞏固練習(xí)】完成Kotlin插件的安裝?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目1課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思
課題項(xiàng)目1任務(wù)2用Kotlin語(yǔ)言實(shí)現(xiàn)倒計(jì)時(shí)功能課型理論課理論課時(shí)2課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)1.能夠掌握Kotlin基礎(chǔ)語(yǔ)法,能掌握Kotlin類型與表達(dá)式。2.能夠理解Kotlin泛型和注解。3.能夠掌握Kotlin的反射。4.能夠掌握Kotlin的協(xié)程。1.能夠利用常見(jiàn)集成開(kāi)發(fā)環(huán)境創(chuàng)建工程項(xiàng)目,并能實(shí)現(xiàn)程序正確編譯和運(yùn)行。2.能靈活使用Kotlin泛型、Kotlin的反射、Kotlin中的協(xié)程。教學(xué)重點(diǎn)Kotlin泛型、Kotlin的反射、Kotlin中的協(xié)程。教學(xué)難點(diǎn)Kotlin的反射。教學(xué)內(nèi)容1.Kotlin基礎(chǔ)語(yǔ)法(1)注釋kotlin支持單行和多行注釋。(2)函數(shù)定義①函數(shù)定義使用關(guān)鍵字fun,函數(shù)參數(shù)格式為:參數(shù):類型。返回值類型的定義是在函數(shù)頭后面加冒號(hào):返回值類型。例如:funsum(a:Int,b:Int):Int{//Int參數(shù),返回值Intreturna+b}②表達(dá)式可以作為函數(shù)體,函數(shù)返回值類型可以自動(dòng)推斷,例如:funsum(x:Int,y:Int)=x+ypublicfunsum(x:Int,y:Int):Int=x+y③無(wú)返回值的函數(shù)(類似Java中的void),有兩種形式,一種是用Unit類型修飾,另外一種是直接省略不寫,例如:fundoSomething(){}fundoSomething():Unit{}(3)可變長(zhǎng)參數(shù)函數(shù)函數(shù)的可變長(zhǎng)參數(shù)可以用vararg關(guān)鍵字進(jìn)行標(biāo)識(shí),例如:funvars(varargv:String){for(strinv){print(str+"")}}//測(cè)試funmain(args:Array<String>){vars("aaa","bbb","ccc")//輸出12345}程序運(yùn)行后輸出:aaabbbccc(4)lambda(匿名函數(shù))lambda就是將一小段代碼封裝成匿名函數(shù),以參數(shù)值的方式傳遞到函數(shù)中,供函數(shù)使用,例如:funmain(args:Array<String>){valmin:(Int,Int)->Int={x,y->//只能返回Int類型,最后一句表達(dá)式的返回值必須為Int//if表達(dá)式返回Intif(x<y){x}else{y}}print(min(1,2))}程序運(yùn)行后輸出:1上面的代碼在main函數(shù)中定義了一個(gè)求最小值的匿名函數(shù)min。(5)定義常量與變量在kotlin中,變量與常量在定義的時(shí)候可以不用賦初始值,但是在使用前一定要初始化。在kotlin中,變量的定義使用關(guān)鍵字var,格式為:var<標(biāo)識(shí)符>:<類型>=<初始化值>例如:vara:Int=12在kotlin中,常量的定義使用關(guān)鍵字val,格式為:val<標(biāo)識(shí)符>:<類型>=<初始化值>例如:vala:Int=12Kotlin的編譯器支持自動(dòng)類型判斷,即聲明時(shí)可以不指定類型,由編譯器判斷。例如:vara=12(6)區(qū)間表達(dá)式區(qū)間表達(dá)式由具有操作符形式..的rangeTo函數(shù)輔以in和!in形成。區(qū)間是為任何可比較類型定義的,但對(duì)于整型原生類型,它有一個(gè)優(yōu)化的實(shí)現(xiàn)。以下是使用區(qū)間的一些示例:for(iin1..4)print(i)//輸出“1234”for(iin4..1)print(i)//什么都不輸出if(iin1..10){//等同于1<=i&&i<=10println(i)}//使用step指定步長(zhǎng)for(iin1..4step2)print(i)//輸出“13”for(iin4downTo1step2)print(i)//輸出“42”//使用until函數(shù)排除結(jié)束元素for(iin1until10){//iin[1,10)排除了10println(i)}2.Kotlin基本數(shù)據(jù)類型(1)基本數(shù)據(jù)類型Kotlin的基本數(shù)值類型包括Byte、Short、Int、Long、Float、Double等。(2)字符類型字符類型用Char描述,Kotlin中的Char不能直接和數(shù)字操作,Char必需是單引號(hào)'包含起來(lái)的。比如普通字符'0','a'。(3)布爾類型布爾用Boolean類型表示,它有兩個(gè)值:true和false。(4)字符串類型字符串類型用String描述,可以通過(guò)[]獲取某個(gè)字符,例如:vara:String="123"print(a[0])3.Kotlin泛型和注解泛型,即"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。(1)泛型類的基本使用泛型類指的就是在類定義的時(shí)候并不會(huì)設(shè)置類中的屬性或方法中的參數(shù)的具體類型,而在類使用時(shí)再進(jìn)行屬性類型的定義。定義泛型類,就是在類名之后、主構(gòu)造函數(shù)之前用尖括號(hào)括起的大寫字母代表某種數(shù)據(jù)類型。在定義泛型類型的變量時(shí),可以完整地寫明類型參數(shù),如果編譯器可以自動(dòng)推定類型參數(shù),也可以省略類型參數(shù)。例如:(2)泛型函數(shù)的基本使用在定義泛型函數(shù)時(shí),泛型函數(shù)的類型參數(shù)要放在函數(shù)名的前面,例如:fun<E>test(num:E):E{returnnum;}funmain(args:Array<String>){print(test<Int>(1))print(test<String>("hello"))}(3)Kotlin中的注解①注解的基礎(chǔ)知識(shí)注解就是向代碼中添加元數(shù)據(jù)。通過(guò)在類名前添加annotation來(lái)聲明注解。Kotlin中有以下四種元注解(用來(lái)定義注解的注解):@Target:限定注解標(biāo)記的目標(biāo)(屬性、方法、類、擴(kuò)展等等)@Retention:限定注解是否存儲(chǔ)到字節(jié)碼文件中;在運(yùn)行時(shí)通過(guò)反射是否可見(jiàn)(默認(rèn)情況下以上兩個(gè)條件均為真)@Repeatable:允許在同一個(gè)元素上重復(fù)使用同一個(gè)注解@MustBeDocumented:指定該注解是公有API的一部分,并且應(yīng)該包含在生成的API文檔中顯示的類或方法的簽名中。在Kotlin中定義一個(gè)注解類,需要使用annotation關(guān)鍵字。例如:@Target(AnnotationTarget.CLASS,AnnotationTarget.PROPERTY)@Retention(AnnotationRetention.RUNTIME)annotationclassValue通過(guò)定義,@Value注解可以用來(lái)修飾類和屬性,并且這個(gè)注解在運(yùn)行時(shí)可見(jiàn),可以通過(guò)反射技術(shù)獲取@Value注解的相關(guān)信息。例如:下圖的例子中,@Value可以注解在類Stu和屬性name,age上面。②帶屬性的注解在kotlin中,可以為注解添加屬性。例如:上面的例子中,@Value具有屬性value,在給類進(jìn)行注解時(shí),需要傳遞參數(shù)給屬性,這些屬性值一般只有在程序運(yùn)算時(shí)通過(guò)反射技術(shù)獲得得到才有意義。4.Kotlin的反射反射是指計(jì)算機(jī)程序在運(yùn)行時(shí)(Runtime)可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。下面對(duì)Kotlin中的反射技術(shù)進(jìn)行一個(gè)簡(jiǎn)要介紹。(1)獲取KClasskotlin的KClass和java的Class可以看作同一個(gè)含義的類型。可以通過(guò)兩種方法獲取類的KClass:①類名().javaClass.kotlin②類名::class例如:程序運(yùn)行后輸出:true在該例中通過(guò)兩種方法獲取Person的KClass。(2)通過(guò)反射創(chuàng)建對(duì)象在Kotlin中可以通過(guò)兩種方法創(chuàng)建對(duì)象,這兩種方法都需要對(duì)應(yīng)的類提供無(wú)參構(gòu)造函數(shù)。以上面的例子為例,創(chuàng)建Person對(duì)象:(3)通過(guò)反射獲取對(duì)象的成員、方法等要通過(guò)反射技術(shù)獲取對(duì)象的成員變量可以使用:KClass.declaredMemberProperties,獲取成員方法通過(guò)KClass.declaredFunctions。下面的例子將對(duì)這兩種操作進(jìn)行演示:5、Kotlin中的協(xié)程協(xié)程(Coroutine)也叫微線程,也稱為輕量級(jí)Thread,是一種新的多任務(wù)并發(fā)的操作手段。它是運(yùn)行在單線程中的并發(fā)程序。能大幅度提高并發(fā)性能。協(xié)程開(kāi)發(fā)包在kotlinx.coroutines中,這個(gè)包可以build.gradle中通過(guò)dependencies引入。如:dependencies{implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2")}(1)協(xié)程的啟動(dòng)協(xié)程的啟動(dòng)有多種,下面將對(duì)GlobalScope.launch()和runBlocking()兩種方式進(jìn)行介紹。1)方式一、GlobalScope.launchGlobalScope.launch創(chuàng)建的協(xié)程的生命周期受主應(yīng)用程序的生命周期期限,如果主應(yīng)用程序執(zhí)行結(jié)束,由GlobalScope.launch創(chuàng)建的協(xié)程即使還沒(méi)執(zhí)行完畢,也會(huì)直接退出。①通過(guò)GlobalScope.launch創(chuàng)建一個(gè)協(xié)程②協(xié)程首先通過(guò)delay(1000L)非阻塞等待1秒,再輸出World!信息。③在協(xié)程非阻塞等待的時(shí)候,主線程運(yùn)行println("Hello,--->"+Thread.currentThread().name)④主線程Thread.sleep(2000),阻塞主線程2秒鐘,等待協(xié)程完成任務(wù)。程序運(yùn)行后輸出:Hello,--->mainWorld!--->DefaultDispatcher-worker-1如果把Thread.sleep(2000)這行代碼去掉,則程序執(zhí)行結(jié)果是:Hello,--->main因?yàn)橹骶€程輸出hello信息以后就直接結(jié)束,而通過(guò)GlobalScope.launch創(chuàng)建的協(xié)程的生命周期和主線程一樣,所以也跟著主線程結(jié)束。GlobalScope.launch是創(chuàng)建協(xié)程最常用的方式。2)方式二、runBlockingrunBlocking函數(shù)和launch函數(shù)的不同點(diǎn)是會(huì)阻塞調(diào)用者線程直到協(xié)程完成。①通過(guò)GlobalScope.launch創(chuàng)建一個(gè)協(xié)程A,A協(xié)程將在1秒后輸出World信息。②主線程不受A協(xié)程的影響,繼續(xù)往下執(zhí)行,輸出hello信息。③接著通過(guò)runBlocking創(chuàng)建了協(xié)程B,B協(xié)程中的代碼delay(5000L),會(huì)阻塞主線程5秒,④在此期間A協(xié)程休息1秒后輸出World,B協(xié)程在休息5秒以后繼續(xù)運(yùn)行,主線程也解除阻塞輸出主線程運(yùn)行結(jié)束。⑤runBlocking通常只用于啟動(dòng)最外層的協(xié)程,保證其他的協(xié)程順利執(zhí)行完任務(wù)。程序運(yùn)行后輸出:Hello,World!主線程運(yùn)行結(jié)束(2)協(xié)程的取消如果主線程已經(jīng)執(zhí)行完畢,協(xié)程還在運(yùn)行,協(xié)程會(huì)直接結(jié)束運(yùn)行,因?yàn)閰f(xié)程的生命周期和主線程一樣。如果要避免出現(xiàn)這種情況,可以在主線程的后面通過(guò)sleep函數(shù)阻塞主線程,等待協(xié)程結(jié)束。這并不是一種很好的方法,因?yàn)閰f(xié)程需要執(zhí)行多少時(shí)間才結(jié)束,主線程并不知道,只能預(yù)估一個(gè)大于協(xié)程執(zhí)行的時(shí)間用于阻塞。更好的方法是通過(guò)join()函數(shù)實(shí)現(xiàn)。GlobalScope.launch函數(shù)的返回值是Job類型,Job的join函數(shù)可以在主線程和協(xié)程之間實(shí)現(xiàn)同步。程序運(yùn)行后輸出:helloWorld!--->DefaultDispatcher-worker-1end如果要取消協(xié)程的執(zhí)行可以調(diào)用job.cancel();教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】GPS定位應(yīng)用非常廣泛,隨著航天科技的飛速發(fā)展,GPS定位系統(tǒng)可實(shí)現(xiàn)的功能也越來(lái)越多,本任務(wù)我們將解決如何利用騰訊位置服務(wù)提供的API實(shí)現(xiàn)GPS定位的問(wèn)題。【教學(xué)實(shí)施】6.2.1任務(wù)描述使用Kotlin語(yǔ)言實(shí)現(xiàn)倒計(jì)時(shí)功能。點(diǎn)擊按鈕“開(kāi)始倒計(jì)時(shí)”,開(kāi)始30秒倒計(jì)時(shí);點(diǎn)擊按鈕“暫停倒計(jì)時(shí)”,倒計(jì)時(shí)暫停;在暫停情況下再次點(diǎn)擊按鈕“開(kāi)始倒計(jì)時(shí)”,從暫停時(shí)的秒數(shù)開(kāi)始倒計(jì)時(shí)。6.2.2問(wèn)題引導(dǎo)如果所有代碼都寫在主線程會(huì)引起在倒計(jì)時(shí)過(guò)程中無(wú)法點(diǎn)擊按鈕的問(wèn)題,本任務(wù)我們將通過(guò)協(xié)程解決這個(gè)問(wèn)題。6.2.3知識(shí)準(zhǔn)備Kotlin基礎(chǔ)語(yǔ)法Kotlin基本數(shù)據(jù)類型Kotlin泛型和注解Kotlin的反射Kotlin中的協(xié)程?!局R(shí)(技能)鞏固練習(xí)】編寫程序?qū)崿F(xiàn)協(xié)程的啟動(dòng)和取消?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目1課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思《騰訊1+x安卓應(yīng)用開(kāi)發(fā)(中級(jí))》教案
一、教案設(shè)計(jì)課題項(xiàng)目2任務(wù)1圖形的繪制課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)掌握?qǐng)D形繪制的常用類和方法能夠掌握安卓平臺(tái)下圖形的繪制。教學(xué)重點(diǎn)圖形的繪制方法。教學(xué)難點(diǎn)圖形繪制的常用類和方法的靈活使用教學(xué)內(nèi)容Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。1.View類在Android中繪制圖形需要在Canvas上進(jìn)行,而使用Canvas需要使用View.onDraw()方法完成繪制工作,因此,需要定義一個(gè)android.view包中的View類的子類,然后復(fù)寫onDraw()方法。格式如下。classMyViewextendsView{@OverrideprotectedvoidonDraw(Canvascanvas){}}2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(1)publicvoiddrawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)表5-1drawBitmap方法參數(shù)介紹drawBitmap的作用:繪制位圖bitmap要繪制的位圖,此值不能為null。left正在繪制的位圖左側(cè)的位置。top正在繪制的位圖頂部的位置。paint用于繪制位圖的畫筆,此值可能是null。(2)publicvoiddrawCircle(floatcx,floatcy,floatradius,Paintpaint)表5-2drawCircle方法參數(shù)介紹drawCircle的作用:繪制圓形cx要繪制的圓的中心的x坐標(biāo)。cy要繪制的圓的中心的y坐標(biāo)。radius要繪制的圓的半徑。paint用來(lái)畫圓的畫筆,此值不能是null。(3)publicvoiddrawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)表5-3drawLine方法參數(shù)介紹drawLine的作用:繪制線條startX線條起點(diǎn)的x坐標(biāo)。startY線條起點(diǎn)的y坐標(biāo)。stopX線條終點(diǎn)的x坐標(biāo)。stopY線條終點(diǎn)的y坐標(biāo)。paint用于繪制線條的畫筆,此值不能是null。(4)publicvoiddrawOval(RectFoval,Paintpaint)表5-4drawOval方法參數(shù)介紹drawOval的作用:繪制橢圓。oval要繪制的橢圓形矩形邊界,這個(gè)值不能是null。paint畫筆,此值不能是null。(5)publicvoiddrawPath(Pathpath,Paintpaint)表5-5drawPath方法參數(shù)介紹drawPath的作用:繪制路徑path要繪制的路徑,此值不能是null。paint用于繪制路徑的畫筆,此值不能是null。(6)publicvoiddrawPoint(floatx,floaty,Paintpaint)表5-6drawPoint方法參數(shù)介紹drawPoint的作用:繪制點(diǎn)x要繪制的圓的x軸。y要繪制的圓的y軸。paint畫筆,此值不能是null。(7)publicvoiddrawText(Stringtext,floatx,floaty,Paintpaint)表5-7drawText方法參數(shù)介紹drawText的作用:繪制文本text擬繪制的文本,此值不能是null。x正在繪制的文本的x坐標(biāo)y正在繪制的文本的y坐標(biāo)paint畫筆,此值不能是null。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來(lái)設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(1)publicvoidsetARGB(inta,intr,intg,intb)表5-8setARGB方法參數(shù)介紹setARGB的作用:設(shè)置顏色a畫筆的透明度,取值范圍0-255。r畫筆的紅色成分,取值范圍0-255。g畫筆的綠色成分,取值范圍0-255。b畫筆的藍(lán)色成分,取值范圍0-255。(2)publicvoidsetAlpha(inta)表5-9setAlpha方法參數(shù)介紹setAlpha的作用:設(shè)置透明的a畫筆的透明度,取值范圍0-255。(3)publicvoidsetAntiAlias(booleanaa)表5-10setAntiAlias方法參數(shù)介紹setAntiAlias的作用:設(shè)置抗鋸齒aa值為true時(shí),消除鋸齒值為false時(shí),保留鋸齒(4)publicvoidsetColor(intcolor)表5-11setColor方法參數(shù)介紹setColor的作用:設(shè)置顏色color畫筆的顏色,Android內(nèi)部定義有Color類,包含了一些常見(jiàn)顏色定義。(5)publicvoidsetStyle(Paint.Stylestyle)表5-12setStyle方法參數(shù)介紹setStyle的作用:設(shè)置繪制風(fēng)格stylePaint.Style.FILL:填充內(nèi)部Paint.Style.FILL_AND_STROKE:填充內(nèi)部和描邊Paint.Style.STROKE:僅描邊(6)publicvoidsetTextAlign(Paint.Alignalign)表5-13setTextAlign方法參數(shù)介紹setTextAlign的作用:設(shè)置文本對(duì)齊方式alignPaint.Align.LEFT:左對(duì)齊Paint.Align.CENTER:居中對(duì)齊Paint.Align.RIGHT:右對(duì)齊(7)publicvoidsetTextScaleX(floatscaleX)表5-14setTextScaleX方法參數(shù)介紹setTextScaleX的作用:設(shè)置文本水平方向縮放比例scaleX文本水平方向的繪制比例。默認(rèn)值為1.0。值>1.0將放大。值<1.0將縮小。(8)publicvoidsetTextSize(floattextSize)表5-15setTextSize方法參數(shù)介紹setTextSize的作用:設(shè)置文本大小textSize文本大小,以像素為單位。此值必須為>0。(9)publicTypefacesetTypeface(Typefacetypeface)表5-16setTypeface方法參數(shù)介紹setTypeface的作用:設(shè)置文本樣式typefaceTypeface.BOLD為粗體,Typeface.BOLD_ITALIC為粗斜體,Typeface.ITALIC為斜體,Typeface.NORMAL為正常。(10)publicvoidsetUnderlineText(booleanunderlineText)表5-17setUnderlineText方法參數(shù)介紹setUnderlineText的作用:設(shè)置下劃線文字underlineText值為true時(shí),設(shè)置下劃線。值為false時(shí),取消下劃線。4.Color類Color類在android.graphics包中。定義了很多常量的顏色值,可以通過(guò)Color.***使用。典型的顏色值如下。publicstaticfinalintBLACK=-16777216;//黑色publicstaticfinalintBLUE=-16776961;//藍(lán)色publicstaticfinalintCYAN=-16711681;//青色publicstaticfinalintGRAY=-7829368;//灰色publicstaticfinalintGREEN=-16711936;//綠色publicstaticfinalintRED=-65536;//紅色publicstaticfinalintTRANSPARENT=0;//透明色publicstaticfinalintWHITE=-1;//白色publicstaticfinalintYELLOW=-256;//黃色Color類還定義了一些靜態(tài)方法,如下所示。publicstaticintalpha(intcolor))//透明度分量publicstaticintred(intcolor))//紅色分量publicstaticintgreen(intcolor))//綠色分量publicstaticintblue(intcolor)//藍(lán)色分量publicstaticintrgb(intred,intgreen,intblue)//由紅綠藍(lán)三原色組成的顏色值publicstaticintargb(intalpha,intred,intgreen,intblue)//由透明度和紅綠藍(lán)三原色組成的顏色值教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】常見(jiàn)的二維圖形在Android中是如何繪制的呢?AndroidAPI提供一系列進(jìn)行2D繪圖的方法,這些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等類,具有繪制點(diǎn)、線、顏色、2D幾何圖形、圖像處理等功能。【教學(xué)實(shí)施】5.1.1任務(wù)描述利用Canvas、Paint和Color等類繪制如圖所示的指南針表盤。5.1.2問(wèn)題引導(dǎo)常見(jiàn)的二維圖形在Android中是如何繪制的呢?AndroidAPI提供一系列進(jìn)行2D繪圖的方法,這些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等類,具有繪制點(diǎn)、線、顏色、2D幾何圖形、圖像處理等功能。5.1.3知識(shí)準(zhǔn)備View類的作用Canvas類的常用方法Paint類的常用方法Color類定義的常量顏色值和靜態(tài)方法5.1.4完成指南針表盤的繪制5.1.5知識(shí)拓展利用Canvas類提供的不同方法繪制出不同的圖形利用Bitmap、BitmapFactory和Matrix對(duì)圖形圖像進(jìn)行處理【知識(shí)(技能)鞏固練習(xí)】分別繪制出矩形、圓形和三角形?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思
課題項(xiàng)目2任務(wù)2屬性動(dòng)畫的實(shí)現(xiàn)課型理論課理論課時(shí)2課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)理解屬性動(dòng)畫的實(shí)現(xiàn)原理能夠掌握安卓平臺(tái)下屬性動(dòng)畫的實(shí)現(xiàn)。教學(xué)重點(diǎn)屬性動(dòng)畫的實(shí)現(xiàn)方法。教學(xué)難點(diǎn)屬性動(dòng)畫的實(shí)現(xiàn)原理教學(xué)內(nèi)容屬性動(dòng)畫的實(shí)現(xiàn)機(jī)制是通過(guò)對(duì)目標(biāo)對(duì)象進(jìn)行賦值并修改其屬性來(lái)實(shí)現(xiàn)的。例如修改目標(biāo)對(duì)象的alpha屬性值,可以實(shí)現(xiàn)透明度的變化;修改目標(biāo)對(duì)象的rotation屬性值可以實(shí)現(xiàn)旋轉(zhuǎn)角度的變化。ValueAnimator是整個(gè)屬性動(dòng)畫機(jī)制中最核心的一個(gè)類,負(fù)責(zé)計(jì)算初始值和結(jié)束值之間的動(dòng)畫過(guò)渡,我們只需要將初始值和結(jié)束值提供給ValueAnimator,并告訴它動(dòng)畫運(yùn)行的時(shí)長(zhǎng),ValueAnimator就會(huì)幫我們完成從初始值過(guò)渡到結(jié)束值的效果。此外,ValueAnimator還負(fù)責(zé)管理動(dòng)畫的播放次數(shù)、播放模式、以及對(duì)動(dòng)畫設(shè)置監(jiān)聽(tīng)器等。例如,通過(guò)下面的代碼可以實(shí)現(xiàn)將一個(gè)值從0平滑過(guò)渡到1,重復(fù)播放3次,每次播放時(shí)長(zhǎng)是300毫秒。ValueAnimatoranim=ValueAnimator.ofFloat(0f,1f);anim.setDuration(300);//播放時(shí)長(zhǎng)anim.setRepeatCount(3);//播放次數(shù)anim.setRepeatMode(ValueAnimator.REVERSE);//播放模式:反向播放anim.start();//開(kāi)始播放ObjectAnimator是ValueAnimator的一個(gè)子類,也是我們最常接觸到的類。ValueAnimator只是對(duì)值進(jìn)行了一個(gè)平滑的過(guò)渡,而ObjectAnimator則可以直接對(duì)任意對(duì)象的任意屬性進(jìn)行動(dòng)畫操作。通過(guò)調(diào)用ofFloat()方法來(lái)去創(chuàng)建一個(gè)ObjectAnimator的實(shí)例,該方法的第一個(gè)參數(shù)用來(lái)指定動(dòng)畫作用的目標(biāo)對(duì)象,第二個(gè)參數(shù)用來(lái)指定需要變化的是哪個(gè)屬性,第三個(gè)參數(shù)是長(zhǎng)度可變的float數(shù)據(jù),用來(lái)指定動(dòng)畫變化過(guò)程中屬性的值。publicstaticObjectAnimatorofFloat(Objecttarget,StringpropertyName,float...values)下面分別對(duì)透明度、旋轉(zhuǎn)、縮放、平移四種屬性動(dòng)畫進(jìn)行講解。1.透明度動(dòng)畫透明度動(dòng)畫主要通過(guò)指定目標(biāo)對(duì)象的透明度在動(dòng)畫過(guò)程中的值,以及動(dòng)畫持續(xù)的時(shí)間來(lái)實(shí)現(xiàn)的。代碼如下:ObjectAnimatoralpha=ObjectAnimator.ofFloat(imageView,"alpha",0f,1f);alpha.setRepeatCount(2);alpha.setRepeatMode(ObjectAnimator.REVERSE);alpha.setDuration(1000);alpha.start();上述代碼定義了一個(gè)透明度動(dòng)畫,效果是,使imageView從完全透明變換到完全不透明,動(dòng)畫時(shí)間是1秒,并且該動(dòng)畫可以反向重復(fù)2次。表5-21透明度動(dòng)畫ofFloat()方法的參數(shù)透明度動(dòng)畫ofFloat()方法的參數(shù)imageView動(dòng)畫作用在imageView上alpha對(duì)imageView的alpha屬性進(jìn)行動(dòng)畫操作0f,1falpha屬性的值從0變化到1。0表示完全都沒(méi),1表示完全不透明。此處也可以根據(jù)動(dòng)畫需要設(shè)置兩個(gè)以上的值。setRepeatCount(2):設(shè)置動(dòng)畫重復(fù)次數(shù)為2次,如果設(shè)為-1,則表示重復(fù)無(wú)限次。setRepeatMode(ObjectAnimator.REVERSE):設(shè)置動(dòng)畫重復(fù)的方式是反向重復(fù),如果設(shè)為ObjectAnimator.RESTART,則表示正向重復(fù)。setDuration(1000):設(shè)置動(dòng)畫播放時(shí)長(zhǎng)為1000毫秒。start():開(kāi)始播放動(dòng)畫。上述方法setRepeatCount()、setRepeatMode()、setDuration()、start()在其他屬性動(dòng)畫中也可以使用,下面不再單獨(dú)介紹。2.旋轉(zhuǎn)動(dòng)畫旋轉(zhuǎn)動(dòng)畫主要通過(guò)指定目標(biāo)對(duì)象的旋轉(zhuǎn)角度在動(dòng)畫過(guò)程中的值,以及動(dòng)畫持續(xù)的時(shí)間來(lái)實(shí)現(xiàn)的。代碼如下:ObjectAnimatorrotation=ObjectAnimator.ofFloat(imageView,"rotation",0f,180f,0f);rotation.setRepeatCount(2);rotation.setRepeatMode(ObjectAnimator.RESTART);rotation.setDuration(1000);imageView.setPivotX(0);//指定旋轉(zhuǎn)中心點(diǎn)的X坐標(biāo)imageView.setPivotY(0);//指定旋轉(zhuǎn)中心點(diǎn)的Y坐標(biāo)rotation.start();上述代碼定義了一個(gè)旋轉(zhuǎn)動(dòng)畫,效果是,使imageView從0度旋轉(zhuǎn)到180度,再旋轉(zhuǎn)到0度,動(dòng)畫時(shí)間是1秒,并且該動(dòng)畫可以正向重復(fù)2次。表5-22旋轉(zhuǎn)動(dòng)畫ofFloat()方法的參數(shù)旋轉(zhuǎn)動(dòng)畫ofFloat()方法的參數(shù)imageView動(dòng)畫作用在imageView上rotation對(duì)imageView的rotation屬性進(jìn)行動(dòng)畫操作0f,180f,0frotation屬性的值從0變化到180,再變化到0。0/180/90在這里指的是旋轉(zhuǎn)的角度值。此處值的個(gè)數(shù)可以根據(jù)動(dòng)畫需要自行設(shè)置。默認(rèn)情況下,旋轉(zhuǎn)動(dòng)畫的中心點(diǎn)在目標(biāo)對(duì)象的中心位置,如果想修改中心點(diǎn),可以通過(guò)imageView.setPivotX()和imageView.setPivotY()指定旋轉(zhuǎn)中心點(diǎn)的X坐標(biāo)和Y坐標(biāo)。上述代碼中的imageView.setPivotX(0)和imageView.setPivotY(0),表示將imageView的左上角設(shè)置旋轉(zhuǎn)中心點(diǎn)。3.縮放動(dòng)畫縮放動(dòng)畫主要通過(guò)指定目標(biāo)對(duì)象的scaleX和scaleY兩個(gè)屬性在動(dòng)畫過(guò)程中的值,以及動(dòng)畫持續(xù)的時(shí)間來(lái)實(shí)現(xiàn)的。代碼如下:AnimatorSetscale=newAnimatorSet();ObjectAnimatorscaleX=ObjectAnimator.ofFloat(imageView,"scaleX",1f,0.5f,1f);ObjectAnimatorscaleY=ObjectAnimator.ofFloat(imageView,"scaleY",1f,0.5f,1f);scale.setDuration(1000);scale.play(scaleX).with(scaleY);scale.start();上述代碼定義了一個(gè)縮放動(dòng)畫,效果是,使imageView水平方向和垂直方向的尺寸同時(shí)從原來(lái)的大小縮小一半,再同時(shí)放大到原來(lái)的大小,動(dòng)畫時(shí)間是1秒。由于在這里需要對(duì)兩個(gè)屬性的值操作,所以要用到動(dòng)畫集合類AnimatorSet。scale.play(scaleX).with(scaleY);表示同時(shí)執(zhí)行scaleX和scaleY動(dòng)畫。如果想先執(zhí)行scaleX,再執(zhí)行scaleY,則使用代碼scale.play(scaleY).after(scaleX);表5-23縮放動(dòng)畫ofFloat()方法的參數(shù)縮放動(dòng)畫ofFloat()方法的參數(shù)imageView動(dòng)畫作用在imageView上scaleX對(duì)imageView的scaleX屬性進(jìn)行動(dòng)畫操作1f,0.5f,1fscaleX屬性的值從1變化到0.5,再變化到1。1/0.5/1在這里指的是目標(biāo)對(duì)象原來(lái)尺寸的倍數(shù)。此處值的個(gè)數(shù)可以根據(jù)動(dòng)畫需要自行設(shè)置。4.平移動(dòng)畫平移動(dòng)畫主要通過(guò)指定目標(biāo)對(duì)象的translationX和translationY兩個(gè)屬性在動(dòng)畫過(guò)程中的值,以及動(dòng)畫持續(xù)的時(shí)間來(lái)實(shí)現(xiàn)的。代碼如下:AnimatorSettranslate=newAnimatorSet();ObjectAnimatortranslationX=ObjectAnimator.ofFloat(imageView,"translationX",0f,100f,0f);ObjectAnimatortranslationY=ObjectAnimator.ofFloat(imageView,"translationY",0f,100f,0f);translate.setDuration(1000);translate.play(translationY).after(translationX);translate.start();上述代碼定義了一個(gè)平移動(dòng)畫,效果是,使imageView先向右移動(dòng)100px,再向左平移回到原來(lái)的位置,然后向下移動(dòng)100px,再向上平移回到原來(lái)的位置,動(dòng)畫時(shí)間是1秒。由于在這里需要對(duì)兩個(gè)屬性的值進(jìn)行操作,所以也用到了動(dòng)畫集合類AnimatorSet。表5-24平移動(dòng)畫ofFloat()方法的參數(shù)平移動(dòng)畫ofFloat()方法的參數(shù)imageView動(dòng)畫作用在imageView上translationX對(duì)imageView的translationX屬性進(jìn)行動(dòng)畫操作0f,100f,0ftranslationX屬性的值從0變化到100,再變化到0。此處值的個(gè)數(shù)可以根據(jù)動(dòng)畫需要自行設(shè)置。教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】屬性動(dòng)畫是如何實(shí)現(xiàn)動(dòng)畫效果的呢?屬性動(dòng)畫是通過(guò)對(duì)目標(biāo)對(duì)象的進(jìn)行賦值并修改其屬性來(lái)實(shí)現(xiàn)的。例如修改目標(biāo)對(duì)象的Alpha屬性值,可以實(shí)現(xiàn)透明度的變化;修改目標(biāo)對(duì)象的BackgroundColor屬性值可以實(shí)現(xiàn)背景色的變化?!窘虒W(xué)實(shí)施】5.2.1任務(wù)描述點(diǎn)擊不同的按鈕能實(shí)現(xiàn)4種不同的屬性動(dòng)畫效果:透明度動(dòng)畫、旋轉(zhuǎn)動(dòng)畫、縮放動(dòng)畫和平移動(dòng)畫。如圖所示。5.2.2問(wèn)題引導(dǎo)屬性動(dòng)畫是如何實(shí)現(xiàn)動(dòng)畫效果的呢?屬性動(dòng)畫是通過(guò)對(duì)目標(biāo)對(duì)象的進(jìn)行賦值并修改其屬性來(lái)實(shí)現(xiàn)的。例如修改目標(biāo)對(duì)象的Alpha屬性值,可以實(shí)現(xiàn)透明度的變化;修改目標(biāo)對(duì)象的BackgroundColor屬性值可以實(shí)現(xiàn)背景色的變化。5.2.3知識(shí)準(zhǔn)備屬性動(dòng)畫簡(jiǎn)介透明度動(dòng)畫的實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫的實(shí)現(xiàn)縮放動(dòng)畫的實(shí)現(xiàn)平移動(dòng)畫的實(shí)現(xiàn)5.2.4實(shí)現(xiàn)蘋果的透明度、旋轉(zhuǎn)、縮放和平移動(dòng)畫。5.2.5知識(shí)拓展多個(gè)動(dòng)畫的執(zhí)行順序問(wèn)題插值器的使用【知識(shí)(技能)鞏固練習(xí)】實(shí)現(xiàn)時(shí)鐘的秒針轉(zhuǎn)動(dòng)的動(dòng)畫。【教學(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思
課題項(xiàng)目2任務(wù)3逐幀動(dòng)畫的實(shí)現(xiàn)課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)理解逐幀動(dòng)畫的實(shí)現(xiàn)原理能夠掌握安卓平臺(tái)下逐幀動(dòng)畫的實(shí)現(xiàn)。教學(xué)重點(diǎn)逐幀動(dòng)畫的實(shí)現(xiàn)方法。教學(xué)難點(diǎn)逐幀動(dòng)畫的實(shí)現(xiàn)原理教學(xué)內(nèi)容1.指定圖像的播放順序在drawable文件夾下創(chuàng)建xml文件,在該xml文件中指定圖像的播放順序和播放時(shí)長(zhǎng)。要求該xml文件的跟節(jié)點(diǎn)是animation-list。每個(gè)item子節(jié)點(diǎn)表示一幀。代碼示例如下:<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="/apk/res/android"><itemandroid:drawable="@drawable/img1"android:duration="100"/><itemandroid:drawable="@drawable/img2"android:duration="100"/></animation-list>以上代碼片段表示,先顯示img1圖像100毫秒,然后顯示img2圖像100毫秒。drawable屬性用來(lái)指定圖像資源,duration用來(lái)指定顯示此幀的時(shí)間(以毫秒為單位)。更多XML屬性見(jiàn)表5-26。表5-26XML屬性屬性名作用android:drawable用來(lái)指定drawable資源android:duration指定顯示此幀的時(shí)間(以毫秒為單位)android:oneshot默認(rèn)為false,當(dāng)設(shè)置為true時(shí),動(dòng)畫將只運(yùn)行一次,然后停止。android:variablePadding默認(rèn)為false,當(dāng)設(shè)置為true時(shí),則drawable的padding值隨當(dāng)前選擇的狀態(tài)而改變。android:visible用于設(shè)置drawable的可見(jiàn)性,默認(rèn)為false。2.AnimationDrawable類 該類用于創(chuàng)建逐幀動(dòng)畫的對(duì)象。通過(guò)View對(duì)象的getBackground()方法,可以獲得一個(gè)AnimationDrawable對(duì)象。然后調(diào)用AnimationDrawable的start()方法即可啟動(dòng)動(dòng)畫,調(diào)用stop()方法可以在當(dāng)前幀中停止動(dòng)畫。其他常用方法的說(shuō)明見(jiàn)表5-27。表5-27AnimationDrawable類的常見(jiàn)方法方法返回值類型方法名及作用voidaddFrame(Drawableframe,intduration)作用:將幀添加到動(dòng)畫中。booleanisRunning()作用:指示動(dòng)畫當(dāng)前是否正在運(yùn)行。voidsetOneShot(booleanoneShot)作用:設(shè)置動(dòng)畫是應(yīng)該播放一次還是重復(fù)播放。參數(shù)設(shè)為true表示只播放一次。voidstart()從第一幀開(kāi)始播放動(dòng)畫。voidstop()在當(dāng)前幀中停止動(dòng)畫。教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】什么是逐幀動(dòng)畫?逐幀動(dòng)畫指的是逐幀繪制幀內(nèi)容的動(dòng)畫,其實(shí)現(xiàn)原理是把事先準(zhǔn)備好的若干幅靜態(tài)圖像按照指定的順序進(jìn)行播放,利用人眼的“視覺(jué)暫留”性質(zhì),使用戶產(chǎn)生動(dòng)畫的錯(cuò)覺(jué)。每幅圖像稱為一幀?!窘虒W(xué)實(shí)施】5.3.1任務(wù)描述點(diǎn)擊“播放”按鈕后,能將4幅小狗的圖像按照指定的順序進(jìn)行播放,形成小狗原地起跳的動(dòng)畫,同時(shí)“播放”二字變成“暫?!保c(diǎn)擊“暫?!卑粹o后,動(dòng)畫暫停播放。如圖所示。5.3.2問(wèn)題引導(dǎo)什么是逐幀動(dòng)畫?逐幀動(dòng)畫指的是逐幀繪制幀內(nèi)容的動(dòng)畫,其實(shí)現(xiàn)原理是把事先準(zhǔn)備好的若干幅靜態(tài)圖像按照指定的順序進(jìn)行播放,利用人眼的“視覺(jué)暫留”性質(zhì),使用戶產(chǎn)生動(dòng)畫的錯(cuò)覺(jué)。每幅圖像稱為一幀。5.3.3知識(shí)準(zhǔn)備指定圖像的播放順序AnimationDrawable類的常用方法5.3.4實(shí)現(xiàn)小狗原地起跳的動(dòng)畫。5.3.5知識(shí)拓展介紹通過(guò)java代碼定義逐幀動(dòng)畫的方法【知識(shí)(技能)鞏固練習(xí)】利用逐幀動(dòng)畫制作一個(gè)進(jìn)程加載動(dòng)畫?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思
課題項(xiàng)目2任務(wù)4音頻的播放課型理論課理論課時(shí)2課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)掌握音頻播放的常用類和方法。能夠控制安卓平臺(tái)下音頻的播放。教學(xué)重點(diǎn)掌握播放音頻的方法。教學(xué)難點(diǎn)音頻播放的常用類和方法的靈活使用。教學(xué)內(nèi)容1.MediaPlayer類的常用方法在Android中播放音頻文件一般是通過(guò)MediaPlayer類實(shí)現(xiàn)的,該類對(duì)多種格式的音頻文件提供了非常全面的控制方法,其常用方法見(jiàn)表5-28。表5-28MediaPlayer類的常用方法方法返回值類型方法名及作用voidsetDataSource()作用:設(shè)置播放的音頻文件。voidPrepare()作用:準(zhǔn)備音頻文件以便播放。voidprepareAsync()作用:以異步的方式準(zhǔn)備音頻文件以便播放。voidstart()作用:開(kāi)始播放或者繼續(xù)播放音頻。voidpause()作用:暫停播放音頻。voidseekTo()作用:把播放頭移動(dòng)到指定的時(shí)間位置voidstop()作用:停止播放音頻。voidrelease()作用:釋放與MediaPlayer對(duì)象相關(guān)的資源。booleanisPlaying作用:判斷音頻是否正確播放。intgetCurrentPosition()作用:獲取當(dāng)前播放位置。intgetDuration()作用:獲取音頻文件的時(shí)長(zhǎng)2.MediaPlayer的狀態(tài)圖MediaPlayer具有內(nèi)部狀態(tài),某些操作僅在播放器處于特定狀態(tài)時(shí)才有效。如果您在錯(cuò)誤的狀態(tài)下執(zhí)行某項(xiàng)操作,則系統(tǒng)可能會(huì)拋出異常。圖5-5是官方文檔給出的MediaPlayer狀態(tài)圖。圖5-5MediaPlayer狀態(tài)圖該圖說(shuō)明了哪些方法可將MediaPlayer從一種狀態(tài)變?yōu)榱硪环N狀態(tài)。例如,當(dāng)您創(chuàng)建新的MediaPlayer時(shí),它處于“Idle”狀態(tài)。此時(shí),您應(yīng)該通過(guò)調(diào)用setDataSource()初始化該類,使其處于“Initialized”狀態(tài)。然后,您必須使用prepare()或prepareAsync()方法完成準(zhǔn)備工作。當(dāng)MediaPlayer準(zhǔn)備就緒后,它便會(huì)進(jìn)入“Prepared”狀態(tài),這也意味著您可以通過(guò)調(diào)用start()使其播放媒體內(nèi)容。此時(shí),如圖5-5所示,您可以通過(guò)調(diào)用start()、pause()和seekTo()等方法在“Started”、“Paused”和“PlaybackCompleted”狀態(tài)之間切換。不過(guò)請(qǐng)注意,當(dāng)您調(diào)用stop()時(shí),除非您再次準(zhǔn)備MediaPlayer,否則將無(wú)法再次調(diào)用start()。3.MediaPlayer的三種數(shù)據(jù)源MediaPlayer可以播放raw文件夾下的音頻文件,也可以播放sd卡中的音頻文件,還可以播放網(wǎng)絡(luò)音頻文件。示例代碼如下://設(shè)置raw文件夾下的音頻文件為數(shù)據(jù)源mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.xxx);//設(shè)置sd卡中的音頻文件為數(shù)據(jù)源mediaPlayer.setDataSource("sd卡中音頻文件的路徑");//設(shè)置網(wǎng)絡(luò)音頻文件為數(shù)據(jù)源mediaPlayer.setDataSource("http://..../xxx.mp3");需要注意的是,如果您使用MediaPlayer播放基于網(wǎng)絡(luò)的內(nèi)容,則您的應(yīng)用必須申請(qǐng)網(wǎng)絡(luò)訪問(wèn)權(quán)限。<uses-permissionandroid:name="android.permission.INTERNET"/>4.播放音頻文件在設(shè)置完數(shù)據(jù)源后,播放音頻文件前,需要調(diào)用prepare()或者prepareAync()對(duì)音頻文件進(jìn)行解析。prepare()是同步操作,用于解析小文件,prepareAync()是異步操作,用于解析大文件,以便造成UI線程阻塞。示例代碼如下:(1)小音頻文件mediaPlayer.prepare();mediaPlayer.start();//開(kāi)始播放(2)大音頻文件mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(newMediaPlayer.OnPreparedListener(){@OverridepublicvoidonPrepared(MediaPlayermp){mp.start();//開(kāi)始播放}});需要注意的是,使用create()方法創(chuàng)建MediaPlayer對(duì)象并設(shè)置數(shù)據(jù)源時(shí),不需要調(diào)用prepare()方法,直接調(diào)用start()播放音頻文件即可。教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】音頻的播放是Android開(kāi)發(fā)中較為常用的功能,Android是如何實(shí)現(xiàn)對(duì)音頻播放的支持的呢?Android提供的對(duì)音頻進(jìn)行處理的API包是android.media,media中包括了AudioManager、MediaPlayer等類,具有設(shè)置音頻類型,以及控制音頻的播放、暫停、停止等功能?!窘虒W(xué)實(shí)施】5.4.1任務(wù)描述本任務(wù)需要實(shí)現(xiàn)的功能是:通過(guò)Switch開(kāi)關(guān)按鈕控制背景音樂(lè)的播放。當(dāng)按鈕處于打開(kāi)狀態(tài)時(shí),能播放音樂(lè),并顯示文字“音樂(lè)播放中”,當(dāng)按鈕處于關(guān)閉狀態(tài)時(shí),能暫停音樂(lè)的播放,并顯示文字“音樂(lè)暫停播放”,當(dāng)Activity被銷毀時(shí),停止音樂(lè)的播放,并釋放播放器占用的資源。如圖所示。5.4.2問(wèn)題引導(dǎo)音頻的播放是Android開(kāi)發(fā)中較為常用的功能,Android是如何實(shí)現(xiàn)對(duì)音頻播放的支持的呢?Android提供的對(duì)音頻進(jìn)行處理的API包是android.media,media中包括了AudioManager、MediaPlayer等類,具有設(shè)置音頻類型,以及控制音頻的播放、暫停、停止等功能。5.4.3知識(shí)準(zhǔn)備MediaPlayer類的常用方法MediaPlayer的狀態(tài)圖MediaPlayer的三種數(shù)據(jù)源播放音頻文件5.4.4通過(guò)Switch開(kāi)關(guān)按鈕控制背景音樂(lè)的播放。5.4.5知識(shí)拓展SoundPool類的常用方法使用SoundPool播放音頻的過(guò)程加載音頻文件播放音頻【知識(shí)(技能)鞏固練習(xí)】制作一個(gè)音頻播放器,能實(shí)現(xiàn)暫停和播放功能?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思
課題項(xiàng)目2任務(wù)5視頻的播放課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)掌握視頻播放的常用類和方法。能夠控制安卓平臺(tái)下視頻的播放。教學(xué)重點(diǎn)掌握播放視頻的方法。教學(xué)難點(diǎn)視頻播放的常用類和方法的靈活使用。教學(xué)內(nèi)容1.SurfaceView簡(jiǎn)介SurfaceView把視頻解析成的一幀一幀的圖像,并把這些圖像顯示出來(lái)。如果把這些工作放在一個(gè)線程中完成,會(huì)導(dǎo)致畫面不流暢或者視頻不同步的情況發(fā)生。SurfaceView通過(guò)雙緩沖機(jī)制解決這個(gè)問(wèn)題,即通過(guò)兩個(gè)線程循環(huán)交替地解析某一幀圖像和顯示圖像,前端緩沖區(qū)是正在渲染的圖形緩沖區(qū),而后端緩沖區(qū)是接下來(lái)要渲染的圖形緩沖區(qū)。當(dāng)我們要播放某一幀時(shí),它已經(jīng)提前幫我們加載好后面一幀了,所以播放起視頻很流暢。2.Surface簡(jiǎn)介Surface是由屏幕顯示內(nèi)容合成器(screencompositor)所管理的原生緩沖器的句柄。即通過(guò)Surface可以獲得原生緩沖器以及其中的內(nèi)容。原生緩沖器(rawbuffer)是用來(lái)保存當(dāng)前窗口的像素?cái)?shù)據(jù)的。Surface中的Canvas成員能用于畫圖形或圖像。Surface用通過(guò)SurfaceView展示其中的內(nèi)容。3.SurfaceHolder簡(jiǎn)介SurfaceHolder是一個(gè)接口,用于維護(hù)和管理SurfaceView背后的Surface。SurfaceHolder通過(guò)三個(gè)回調(diào)方法,讓我們可以監(jiān)聽(tīng)到Surface的創(chuàng)建、銷毀或者改變。在SurfaceView中有一個(gè)方法getHolder(),可以很方便地獲得SurfaceView背后的Surface所對(duì)應(yīng)的SurfaceHolder。//監(jiān)聽(tīng)Surface在創(chuàng)建、銷毀、改變時(shí)的狀態(tài)surfaceView.getHolder().addCallback(newSurfaceHolder.Callback(){//當(dāng)Surface創(chuàng)建時(shí)調(diào)用@OverridepublicvoidsurfaceCreated(SurfaceHoldersurfaceHolder){}//當(dāng)surface發(fā)生結(jié)構(gòu)性變化時(shí)(格式或者大?。〡OverridepublicvoidsurfaceChanged(SurfaceHoldersurfaceHolder,inti,inti1,inti2){}//當(dāng)Surface銷毀時(shí)調(diào)用@OverridepublicvoidsurfaceDestroyed(SurfaceHoldersurfaceHolder){}});教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】Android是如何實(shí)現(xiàn)對(duì)視頻播放的支持的呢?與音頻播放相比,視頻的播放需要將影像展示出來(lái)。在Android系統(tǒng)中,MediaPlayer不僅可以播放音頻,還可以與SurfaceView相配合播放視頻,SurfaceView主要負(fù)責(zé)顯示MediaPlayer中解析得到的視頻圖像。【教學(xué)實(shí)施】5.5.1任務(wù)描述本任務(wù)需要實(shí)現(xiàn)的功能是:通過(guò)MediaPlayer和SurfaceView實(shí)現(xiàn)視頻的播放。左邊的按鈕實(shí)現(xiàn)繼續(xù)播放和暫停播放功能的切換,右邊的按鈕實(shí)現(xiàn)重播的功能。當(dāng)Activity最小化后再重新顯示時(shí),視頻能從最小化前的位置開(kāi)始播放。當(dāng)Activity被銷毀時(shí),停止視頻的播放,并釋放播放器占用的資源。界面效果如圖所示。5.5.2問(wèn)題引導(dǎo)Android是如何實(shí)現(xiàn)對(duì)視頻播放的支持的呢?與音頻播放相比,視頻的播放需要將影像展示出來(lái)。在Android系統(tǒng)中,MediaPlayer不僅可以播放音頻,還可以與SurfaceView相配合播放視頻,SurfaceView主要負(fù)責(zé)顯示MediaPlayer中解析得到的視頻圖像。5.5.3知識(shí)準(zhǔn)備SurfaceView簡(jiǎn)介Surface簡(jiǎn)介SurfaceHolder簡(jiǎn)介5.5.4實(shí)現(xiàn)視頻的播放、暫停播放、繼續(xù)播放和重播。5.5.5知識(shí)拓展介紹在Android系統(tǒng)中使用VideoView控件播放視頻的方法?!局R(shí)(技能)鞏固練習(xí)】使用同一個(gè)按鈕實(shí)現(xiàn)視頻的播放和暫停?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思課題項(xiàng)目2任務(wù)6相機(jī)和相冊(cè)的使用課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)1課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)掌握使用系統(tǒng)內(nèi)置Activity實(shí)現(xiàn)拍照和讀取相冊(cè)的方法。能夠控制安卓系統(tǒng)相機(jī)和相冊(cè)。教學(xué)重點(diǎn)掌握控制安卓系統(tǒng)相機(jī)和相冊(cè)的方法。教學(xué)難點(diǎn)調(diào)用系統(tǒng)內(nèi)置拍照出錯(cuò)解決方法。教學(xué)內(nèi)容1.在AndroidManifest.xml文件的manifest節(jié)點(diǎn)中聲明使用相機(jī)的權(quán)限和外部存儲(chǔ)設(shè)備的存取權(quán)限。<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2.動(dòng)態(tài)申請(qǐng)權(quán)限拍照需要申請(qǐng)使用相機(jī)的權(quán)限"android.permission.CAMERA",存取圖片需要申請(qǐng)讀外部存儲(chǔ)設(shè)備的權(quán)限“android.permission.READ_EXTERNAL_STORAGE”和寫外部存儲(chǔ)設(shè)備的權(quán)限“android.permission.WRITE_EXTERNAL_STORAGE”。首先在AndroidManifest.xml文件中的manifest節(jié)點(diǎn)聲明權(quán)限,代碼如下:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>在Android6.0以后開(kāi)始,對(duì)于部分敏感的“危險(xiǎn)”權(quán)限,需要在應(yīng)用運(yùn)行時(shí)向用戶申請(qǐng),只有用戶允許的情況下這個(gè)權(quán)限才會(huì)被授予給應(yīng)用。因此,接下來(lái)還需要在代碼中動(dòng)態(tài)申請(qǐng)權(quán)限。分為兩個(gè)步驟,一是使用ContextCompat的checkSelfPermission()檢測(cè)相關(guān)權(quán)限是否被用戶許可了,如果沒(méi)有許可,則調(diào)用ActivityCompat的requestPermissions()請(qǐng)求用戶授權(quán);二是通過(guò)對(duì)onRequestPermissionsResult()方法的回調(diào)判斷用戶是否同意授權(quán),如果結(jié)果是PackageManager.PERMISSION_GRANTED則表示用戶同意授權(quán),如果結(jié)果是PackageManager.PERMISSION_DENIED則表示用戶不同意授權(quán)。示例代碼如下://檢測(cè)相機(jī)權(quán)限if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){//如果未授權(quán)時(shí),則請(qǐng)求用戶授權(quán)ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.CAMERA},PERMISSIONS_REQUEST);}else{//如果已經(jīng)授權(quán),在此處編寫相應(yīng)的功能代碼}//用戶對(duì)授權(quán)請(qǐng)求做出反饋后,回調(diào)該方法@OverridepublicvoidonRequestPermissionsResult(intrequestCode,Stringpermissions[],int[]grantResults){switch(requestCode){casePERMISSIONS_REQUEST:if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//如果用戶同意授權(quán)了,在此處編寫相應(yīng)的功能代碼}else{//如果用戶不同意授權(quán),則在此處編寫相應(yīng)的功能代碼}}}3.使用攝像頭拍照調(diào)用系統(tǒng)拍照程序可以非常方便地實(shí)現(xiàn)使用攝像頭拍照的功能。具體做法是,創(chuàng)建一個(gè)動(dòng)作為MediaStore.ACTION_IMAGE_CAPTURE的Intent對(duì)象,調(diào)用Intent的putExtra()方法指定照片輸出路徑,執(zhí)行startActivityForResult()方法啟動(dòng)系統(tǒng)自帶的拍照程序,即可使用攝像頭進(jìn)行拍照。代碼如下:IntentintentCapture=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);intentCapture.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(picFile));//1startActivityForResult(intentCapture,REQUEST_CAMERA);需要注意的是,以上代碼的注釋1處的含義是,將用于保存照片的文件picFile的URI通過(guò)Intent對(duì)象傳遞給系統(tǒng)的拍照程序,這就意味著將文件URI暴露給了另一個(gè)Activity,如果不做處理,程序運(yùn)行時(shí)將會(huì)報(bào)出如下錯(cuò)誤:android.os.FileUriExposedException:file:///storage/emulated/0/Pictures/***.jpgexposedbeyondappthroughClipData.Item.getUri()解決該錯(cuò)誤的辦法是,在onCreate()方法中,調(diào)用StrictMode.VmPolicy.Builder的detectFileUriExposure()方法檢測(cè)文件URI暴露信息。代碼如下:StrictMode.VmPolicy.Builderbuilder=newStrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();拍照后,在onActivityResult()中處理照片的uri,將照片顯示到ImageView中,并發(fā)送廣播通知圖庫(kù)更新。ivAvatar.setImageURI(Uri.fromFile(picFile));//發(fā)送廣播,通知圖庫(kù)更新Intentintent=newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uriuri=Uri.fromFile(picFile);intent.setData(uri);sendBroadcast(intent);4.讀取相冊(cè)的圖片使用Android內(nèi)置的Activity可以方便地實(shí)現(xiàn)選取相冊(cè)圖片的功能。具體做法是,創(chuàng)建一個(gè)動(dòng)作為Intent.ACTION_PICK的Intent對(duì)象,指定uri為MediaStore.Images.Media.EXTERNAL_CONTENT_URI,執(zhí)行startActivityForResult()方法打開(kāi)系統(tǒng)相冊(cè)界面。代碼如下:IntentintentAlbum=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intentAlbum.setType("image/*");//打開(kāi)相冊(cè)選擇界面startActivityForResult(intentAlbum,REQUEST_ALBUM);然后在onActivityResult()中處理返回的圖片uri,將圖片顯示到ImageView中即可。@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,@NullableIntentdata){super.onActivityResult(requestCode,resultCode,data);if(resultCode==RESULT_OK){if(requestCode==REQUEST_CAMERA){//如果是“拍照”…}elseif(requestCode==REQUEST_ALBUM){//如果是“從相冊(cè)中選擇”UridataUri=data.getData();ContentResolvercontentResolver=getContentResolver();try{Bitmapbitmap=BitmapFactory.decodeStream(contentResolver.openInputStream(dataUri));ivAvatar.setImageBitmap(bitmap);}catch(FileNotFoundExceptione){e.printStackTrace();}}}}教學(xué)準(zhǔn)備教材,PPT、教綱、教案參考資料/教學(xué)過(guò)程方法與手段教學(xué)備注【課堂導(dǎo)入】在常用的App中(例如QQ、微信、微博等),經(jīng)常需要分享圖片,此時(shí)就需要用到拍照和從相冊(cè)中讀取圖片的功能。在Android中如何實(shí)現(xiàn)這兩個(gè)功能呢?本任務(wù)通過(guò)啟動(dòng)系統(tǒng)自帶的拍照程序和使用Android內(nèi)置的Activity來(lái)實(shí)現(xiàn)這些功能?!窘虒W(xué)實(shí)施】5.6.1任務(wù)描述本任務(wù)將實(shí)現(xiàn)拍照和從相冊(cè)中選擇圖像的功能。如左圖所示,點(diǎn)擊右側(cè)頭像,能打開(kāi)菜單,如右圖所示。當(dāng)用戶選擇“拍照”菜單項(xiàng)時(shí),能打開(kāi)系統(tǒng)拍照程序進(jìn)行拍照,拍出的照片顯示在右側(cè)ImageView中。當(dāng)用戶選擇“從相冊(cè)中選擇”菜單項(xiàng)時(shí),能打開(kāi)相冊(cè),供用戶選擇一張圖片作為頭像。5.6.2問(wèn)題引導(dǎo)在常用的App中(例如QQ、微信、微博等),經(jīng)常需要分享圖片,此時(shí)就需要用到拍照和從相冊(cè)中讀取圖片的功能。在Android中如何實(shí)現(xiàn)這兩個(gè)功能呢?本任務(wù)通過(guò)啟動(dòng)系統(tǒng)自帶的拍照程序和使用Android內(nèi)置的Activity來(lái)實(shí)現(xiàn)這些功能。5.6.3知識(shí)準(zhǔn)備聲明使用相機(jī)的權(quán)限和外部存儲(chǔ)設(shè)備的存取權(quán)限動(dòng)態(tài)申請(qǐng)權(quán)限使用攝像頭拍照讀取相冊(cè)的圖片5.6.4實(shí)現(xiàn)拍照和從相冊(cè)中選擇圖像的功能。5.6.5知識(shí)拓展介紹另一種android.os.FileUriExposedException報(bào)錯(cuò)問(wèn)題的解決的方法。【知識(shí)(技能)鞏固練習(xí)】設(shè)計(jì)一個(gè)簡(jiǎn)易的照相機(jī)?!窘虒W(xué)小結(jié)】講授、演示課后作業(yè)與訓(xùn)練完成項(xiàng)目2課后練習(xí)對(duì)應(yīng)的習(xí)題。教學(xué)反思《騰訊1+x安卓應(yīng)用開(kāi)發(fā)(中級(jí))》教案
一、教案設(shè)計(jì)課題項(xiàng)目3任務(wù)1顯示基礎(chǔ)地圖課型理論課理論課時(shí)1課時(shí)實(shí)踐課時(shí)2課時(shí)教學(xué)目標(biāo)知識(shí)目標(biāo)能力(技能)目標(biāo)1.熟悉騰訊位置服務(wù)地圖key的獲取和配置方法2.熟悉在項(xiàng)目中集成SDK的方法。3.熟悉顯示地圖需要哪些權(quán)限。能利用騰訊提供的位置服務(wù)在界面上顯示基礎(chǔ)地圖。教學(xué)重點(diǎn)掌握顯示基礎(chǔ)地圖的方法。教學(xué)難點(diǎn)圖形繪制的常用類和方法的靈活使用教學(xué)內(nèi)容想要使用騰訊位置服務(wù)地圖SDK,必須先申請(qǐng)一個(gè)開(kāi)發(fā)者賬號(hào),申請(qǐng)地址:/dev/console/home。然后前往/console/key.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 谷子采收后管理制度
- 2025至2030年中國(guó)拍燈行業(yè)投資前景及策略咨詢報(bào)告
- 運(yùn)動(dòng)治療室管理制度
- 運(yùn)行值安全管理制度
- 返沭陽(yáng)人員管理制度
- 2025至2030年中國(guó)手搖帶式電容截?cái)鄼C(jī)行業(yè)投資前景及策略咨詢報(bào)告
- 避難場(chǎng)應(yīng)急管理制度
- 部門先鋒崗管理制度
- 配合比優(yōu)化管理制度
- 配送流程及管理制度
- 江蘇省鎮(zhèn)江市2024-2025學(xué)年蘇科版數(shù)學(xué)七年級(jí)上學(xué)期期末摸底測(cè)評(píng)卷A(含答案)
- 2024-2030年中國(guó)核電泵行業(yè)市場(chǎng)發(fā)展格局及未來(lái)投資潛力分析報(bào)告
- 2021年高級(jí)經(jīng)濟(jì)師(人力資源)考試真題及參考答案
- 煙酒店創(chuàng)業(yè)計(jì)劃書范文
- 龍湖薪酬管理制度
- 金屬櫥柜市場(chǎng)需求與消費(fèi)特點(diǎn)分析
- 《建材產(chǎn)品追溯中國(guó)ISO標(biāo)準(zhǔn)砂》
- 2015年江蘇省南通市中考真題語(yǔ)文試題(解析版)
- 求職簡(jiǎn)歷展示模板
- 大學(xué)物業(yè)服務(wù)月考核評(píng)價(jià)評(píng)分表
- 律師事務(wù)所薪酬分配制度
評(píng)論
0/150
提交評(píng)論