騰訊1 x安卓應(yīng)用開發(fā)(中級(jí))課程-課件_第1頁
騰訊1 x安卓應(yīng)用開發(fā)(中級(jí))課程-課件_第2頁
騰訊1 x安卓應(yīng)用開發(fā)(中級(jí))課程-課件_第3頁
騰訊1 x安卓應(yīng)用開發(fā)(中級(jí))課程-課件_第4頁
騰訊1 x安卓應(yīng)用開發(fā)(中級(jí))課程-課件_第5頁
已閱讀5頁,還剩534頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章Android基礎(chǔ)和環(huán)境搭建

騰訊1+x安卓應(yīng)用開發(fā)(中級(jí))通過本課程的學(xué)習(xí)您將可以學(xué)習(xí)目標(biāo)知識(shí)目標(biāo)

掌握Kotlin基礎(chǔ)語法,能掌握Kotlin類型與表達(dá)式。理解Kotlin泛型和注解。掌握Kotlin的反射。掌握Kotlin中的協(xié)程。技能目標(biāo)

能夠進(jìn)行Kotlin安裝包的下載與安裝。能夠進(jìn)行Kotlin環(huán)境的搭建與配置。能夠利用常見集成開發(fā)環(huán)境創(chuàng)建工程項(xiàng)目,

并能實(shí)現(xiàn)程序正確編譯和運(yùn)行。能夠進(jìn)行Kotlin安裝包的下載與安裝。能夠進(jìn)行Kotlin環(huán)境的搭建與配置。能夠利用常見集成開發(fā)環(huán)境創(chuàng)建工程項(xiàng)目,并能實(shí)現(xiàn)程序正確編譯和運(yùn)行。能夠掌握Kotlin基礎(chǔ)語法,能掌握Kotlin類型與表達(dá)式。能夠理解Kotlin泛型和注解。能夠掌握Kotlin的反射。能夠掌握Kotlin中的協(xié)程。CERTIFICATION認(rèn)證考點(diǎn)項(xiàng)目引導(dǎo)項(xiàng)目名稱項(xiàng)目介紹Android基礎(chǔ)和環(huán)境搭建

2017年,Google宣布Kotlin作為Android官方開發(fā)語言,因此,我們有必要掌握kotlin的基礎(chǔ)知識(shí)。在本項(xiàng)目中,我們將完成kotlin開發(fā)環(huán)境的搭建,并熟悉kotlin的基礎(chǔ)知識(shí)。1.1Kotlin簡(jiǎn)介及開發(fā)環(huán)境搭建1.2Kotlin基礎(chǔ)1.3項(xiàng)目實(shí)訓(xùn)目錄1.1Kotlin簡(jiǎn)介及開發(fā)環(huán)境搭建1.1.1任務(wù)描述1.1.2問題引導(dǎo)1.1.3知識(shí)準(zhǔn)備1.1.4任務(wù)實(shí)施1.1.5知識(shí)拓展1.1.1任務(wù)描述在AndroidStudio中安裝Kotlin插件,搭建Kotlin開發(fā)環(huán)境,以便能在AndroidStudio中使用Kotlin編寫代碼。1.1.2問題引導(dǎo)默認(rèn)情況下,AndroidStudio安裝完成后,還不能使用Kotlin編寫代碼。要想使用Kotlin,必須安裝Kotlin插件。1.1.3知識(shí)準(zhǔn)備Kotlin是JetBrains公司在2010年推出的一種基于JVM的靜態(tài)類型編程語言。Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript,以便在沒有JVM的設(shè)備上運(yùn)行。2017年,Google宣布Kotlin是Android官方開發(fā)語言。使用Kotlin語言,對(duì)于安卓開發(fā)來說,主要有下面幾個(gè)優(yōu)勢(shì)。減少空指針異常。減少代碼量:同樣的功能Kotlin開發(fā)要比Java少50%甚至更多。提升開發(fā)效率:增加了許多現(xiàn)代高級(jí)語言的語法特性,使得開發(fā)效率大大提升。實(shí)現(xiàn)與Java語言的無縫連接:Kotlin可以直接調(diào)用和使用Java編寫的代碼,也可以無縫使用Java第三方開源庫(kù)1.1.4任務(wù)實(shí)施在AndroidStudio中安裝Kotlin開發(fā)環(huán)境,需要先安裝Kotlin插件,安裝步驟如下:1.單擊File|Setting,彈出setting面板,如圖1-1-1所示。圖1-1-1setting面板1.1.4任務(wù)實(shí)施在AndroidStudio中安裝Kotlin開發(fā)環(huán)境,需要先安裝Kotlin插件,安裝步驟如下:2.單擊Plugins,輸入kotlin進(jìn)行搜索,如圖1-1-2。圖1-1-2搜索kotlin3.單擊Install后等待安裝完成即可。1.1.5知識(shí)拓展Kotlin插件還可以離線下載安裝。步驟如下:1.訪問JetBrains官網(wǎng),搜索kotlin插件。如圖1-1-3所示。2.選擇kotlin插件。如圖1-1-4所示。圖1-1-3在JetBrains官網(wǎng)搜索kotlin圖1-1-4選擇kotlin插件1.1.5知識(shí)拓展Kotlin插件還可以離線下載安裝。步驟如下:3.選擇想要的版本號(hào),單擊Download下載。如圖1-1-5所示。圖1-1-5下載插件1.1.5知識(shí)拓展Kotlin插件還可以離線下載安裝。步驟如下:4.在AndroidStudio中,單擊File|Setting,彈出setting面板,單擊Plugins,單擊右邊齒輪,選擇InstallpluginformDisk...導(dǎo)入插件。如圖1-1-6所示。圖1-1-6導(dǎo)入插件1.1.5知識(shí)拓展Kotlin插件還可以離線下載安裝。步驟如下:5.選擇下載好的插件路徑,單擊OK安裝插件。如圖1-1-7所示。安裝完成后重啟AndroidStudio即可。圖1-1-7選擇下載好的插件路徑1.2Kotlin基礎(chǔ)1.2.1任務(wù)描述1.2.2問題引導(dǎo)1.2.3知識(shí)準(zhǔn)備1.2.4任務(wù)實(shí)施1.2.5知識(shí)拓展1.2.1任務(wù)描述使用Kotlin語言實(shí)現(xiàn)倒計(jì)時(shí)功能。點(diǎn)擊按鈕“開始倒計(jì)時(shí)”,開始30秒倒計(jì)時(shí);點(diǎn)擊按鈕“暫停倒計(jì)時(shí)”,倒計(jì)時(shí)暫停;在暫停情況下再次點(diǎn)擊按鈕“開始倒計(jì)時(shí)”,從暫停時(shí)的秒數(shù)開始倒計(jì)時(shí)。圖1-2-1“倒計(jì)時(shí)”效果圖1.2.2問題引導(dǎo)如果所有代碼都寫在主線程會(huì)導(dǎo)致在倒計(jì)時(shí)過程中無法點(diǎn)擊按鈕的情況發(fā)生,因此考慮使用Kotlin的協(xié)程實(shí)現(xiàn)倒計(jì)時(shí)功能,協(xié)程支持掛起,不會(huì)使正在運(yùn)行的線程阻塞。圖1-2-1“倒計(jì)時(shí)”效果圖1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(1)注釋kotlin支持單行和多行注釋,實(shí)例如下://這是一個(gè)單行注釋/*這是一個(gè)多行的塊注釋。*/(2)包聲明kotlin代碼文件的開頭一般為包的聲明:packagecom.test.mainimportjava.util.*funtest(){}classStu{}上例中test()的全名是:com.test.main.test(),類Stu的全名是:com.test.main.Stu。1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(3)默認(rèn)導(dǎo)入在kotlin文件中默認(rèn)會(huì)導(dǎo)入以下包:kotlin.*kotlin.annotation.*kotlin.collections.*parisons.*kotlin.io.*kotlin.ranges.*kotlin.sequences.*kotlin.text.*1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(4)函數(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③無返回值的函數(shù)(類似Java中的void),有兩種形式,一種是用Unit類型修飾,另外一種是直接省略不寫,例如:fundoSomething(){}fundoSomething():Unit{}1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(5)可變長(zhǎng)參數(shù)函數(shù)函數(shù)的可變長(zhǎng)參數(shù)可以用vararg關(guān)鍵字進(jìn)行標(biāo)識(shí),例如:程序運(yùn)行后輸出:aaabbbccc1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(6)lambda(匿名函數(shù))lambda就是將一小段代碼封裝成匿名函數(shù),以參數(shù)值的方式傳遞到函數(shù)中,供函數(shù)使用,例如:程序運(yùn)行后輸出:1上面的代碼在main函數(shù)中定義了一個(gè)求最小值的匿名函數(shù)min。1.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(7)定義常量與變量在kotlin中,變量與常量在定義的時(shí)候可以不用賦初始值,但是在使用前一定要初始化。在kotlin中,變量的定義使用關(guān)鍵字var,格式為:var<標(biāo)識(shí)符>:<類型>=<初始化值>例如:vara:Int=12在kotlin中,常量的定義使用關(guān)鍵字val,格式為:val<標(biāo)識(shí)符>:<類型>=<初始化值>例如:vala:Int=12

Kotlin的編譯器支持自動(dòng)類型判斷,即聲明時(shí)可以不指定類型,由編譯器判斷。例如:vara=121.2.3知識(shí)準(zhǔn)備1.Kotlin基礎(chǔ)語法(8)區(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)}1.2.3知識(shí)準(zhǔn)備2.Kotlin基本數(shù)據(jù)類型(1)基本數(shù)據(jù)類型Kotlin的基本數(shù)值類型包括Byte、Short、Int、Long、Float、Double等。見表1-1。不同于Java的是,字符不屬于數(shù)值類型,是一個(gè)獨(dú)立的數(shù)據(jù)類型。數(shù)據(jù)類型長(zhǎng)度(位)Double64Float32Long64Int32Short16Byte8表1-1基本數(shù)據(jù)類型1.2.3知識(shí)準(zhǔn)備2.Kotlin基本數(shù)據(jù)類型(2)字符類型字符類型用Char描述,Kotlin中的Char不能直接和數(shù)字操作,Char必需是單引號(hào)'包含起來的。比如普通字符'0','a'。varch:Char='1'vara:Int=ch//錯(cuò)誤如果要獲取字符的編碼,可以:vara:Int=ch.code(3)布爾類型布爾用Boolean類型表示,它有兩個(gè)值:true和false。1.2.3知識(shí)準(zhǔn)備2.Kotlin基本數(shù)據(jù)類型(4)字符串類型字符串類型用String描述,可以通過[]獲取某個(gè)字符,例如:程序運(yùn)行后輸出:1231.2.3知識(shí)準(zhǔn)備2.Kotlin基本數(shù)據(jù)類型(4)字符串類型Kotlin支持三個(gè)引號(hào)"""擴(kuò)起來的字符串,支持多行字符串,比如:程序運(yùn)行后輸出:1234561.2.3知識(shí)準(zhǔn)備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ù)。例如:程序運(yùn)行后,輸出:1hello1.2.3知識(shí)準(zhǔn)備3.Kotlin泛型和注解泛型,即"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。(2)泛型函數(shù)的基本使用在定義泛型函數(shù)時(shí),泛型函數(shù)的類型參數(shù)要放在函數(shù)名的前面。例如:程序運(yùn)行后,輸出:1hellofun<E>test(num:E):E{returnnum;}funmain(args:Array<String>){print(test<Int>(1))print(test<String>("hello"))}1.2.3知識(shí)準(zhǔn)備3.Kotlin泛型和注解泛型,即"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。(3)Kotlin中的注解①注解的基礎(chǔ)知識(shí)注解就是向代碼中添加元數(shù)據(jù)。通過在類名前添加annotation來聲明注解。Kotlin中有以下四種元注解(用來定義注解的注解):@Target:限定注解標(biāo)記的目標(biāo)(屬性、方法、類、擴(kuò)展等等)@Retention:限定注解是否存儲(chǔ)到字節(jié)碼文件中;在運(yùn)行時(shí)通過反射是否可見(默認(rèn)情況下以上兩個(gè)條件均為真)@Repeatable:允許在同一個(gè)元素上重復(fù)使用同一個(gè)注解@MustBeDocumented:指定該注解是公有API的一部分,并且應(yīng)該包含在生成的API文檔中顯示的類或方法的簽名中。1.2.3知識(shí)準(zhǔn)備3.Kotlin泛型和注解泛型,即"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。(3)Kotlin中的注解在Kotlin中定義一個(gè)注解類,需要使用annotation關(guān)鍵字。例如:@Target(AnnotationTarget.CLASS,AnnotationTarget.PROPERTY)@Retention(AnnotationRetention.RUNTIME)annotationclassValue通過定義,@Value注解可以用來修飾類和屬性,并且這個(gè)注解在運(yùn)行時(shí)可見,可以通過反射技術(shù)獲取@Value注解的相關(guān)信息。例如:右邊的例子中,@Value可以注解在類Stu和屬性name,age上面。1.2.3知識(shí)準(zhǔn)備3.Kotlin泛型和注解泛型,即"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。(3)Kotlin中的注解②帶屬性的注解在kotlin中,可以為注解添加屬性。例如:上面的例子中,@Value具有屬性value,在給類進(jìn)行注解時(shí),需要傳遞參數(shù)給屬性,這些屬性值一般只有在程序運(yùn)算時(shí)通過反射技術(shù)獲得得到才有意義。1.2.3知識(shí)準(zhǔn)備4.Kotlin的反射反射是指計(jì)算機(jī)程序在運(yùn)行時(shí)(Runtime)可以訪問、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。下面對(duì)Kotlin中的反射技術(shù)進(jìn)行一個(gè)簡(jiǎn)要介紹。(1)獲取KClasskotlin的KClass和java的Class可以看作同一個(gè)含義的類型??梢酝ㄟ^兩種方法獲取類的KClass:①類名().javaClass.kotlin②類名::class例如:程序運(yùn)行后輸出:true在該例中通過兩種方法獲取Person的KClass。1.2.3知識(shí)準(zhǔn)備4.Kotlin的反射(2)通過反射創(chuàng)建對(duì)象在Kotlin中可以通過兩種方法創(chuàng)建對(duì)象,這兩種方法都需要對(duì)應(yīng)的類提供無參構(gòu)造函數(shù)。以上面的例子為例,創(chuàng)建Person對(duì)象:1.2.3知識(shí)準(zhǔn)備4.Kotlin的反射(3)通過反射獲取對(duì)象的成員、方法等要通過反射技術(shù)獲取對(duì)象的成員變量可以使用:KClass.declaredMemberProperties,獲取成員方法通過KClass.declaredFunctions。下面的例子將對(duì)這兩種操作進(jìn)行演示:1.2.3知識(shí)準(zhǔn)備4.Kotlin的反射(3)通過反射獲取對(duì)象的成員、方法等要通過反射技術(shù)獲取對(duì)象的成員變量可以使用:KClass.declaredMemberProperties,獲取成員方法通過KClass.declaredFunctions。下面的例子將對(duì)這兩種操作進(jìn)行演示:1.2.3知識(shí)準(zhǔn)備5、Kotlin中的協(xié)程協(xié)程(Coroutine)也叫微線程,也稱為輕量級(jí)

Thread,是一種新的多任務(wù)并發(fā)的操作手段。它是運(yùn)行在單線程中的并發(fā)程序。能大幅度提高并發(fā)性能。協(xié)程開發(fā)包在

kotlinx.coroutines

中,這個(gè)包可以build.gradle中通過dependencies引入。如:dependencies{implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2")}1.2.3知識(shí)準(zhǔn)備5、Kotlin中的協(xié)程(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é)程即使還沒執(zhí)行完畢,也會(huì)直接退出。1.2.3知識(shí)準(zhǔn)備5、Kotlin中的協(xié)程

1)方式一、GlobalScope.launch1、通過GlobalScope.launch創(chuàng)建一個(gè)協(xié)程2、協(xié)程首先通過delay(1000L)非阻塞等待1秒,再輸出World!信息。3、在協(xié)程非阻塞等待的時(shí)候,主線程運(yùn)行println("Hello,--->"+Thread.currentThread().name)4、主線程Thread.sleep(2000),阻塞主線程2秒鐘,等待協(xié)程完成任務(wù)。程序運(yùn)行后輸出:Hello,--->mainWorld!--->DefaultDispatcher-worker-11.2.3知識(shí)準(zhǔn)備

1)方式一、GlobalScope.launch如果把Thread.sleep(2000)這行代碼去掉,則程序執(zhí)行結(jié)果是:Hello,--->main因?yàn)橹骶€程輸出hello信息以后就直接結(jié)束,而通過GlobalScope.launch創(chuàng)建的協(xié)程的生命周期和主線程一樣,所以也跟著主線程結(jié)束。GlobalScope.launch是創(chuàng)建協(xié)程最常用的方式。程序運(yùn)行后輸出:Hello,--->main5、Kotlin中的協(xié)程1.2.3知識(shí)準(zhǔn)備2)方式二、runBlockingrunBlocking函數(shù)和launch函數(shù)的不同點(diǎn)是會(huì)阻塞調(diào)用者線程直到協(xié)程完成。

程序運(yùn)行后輸出:Hello,World!主線程運(yùn)行結(jié)束

1、通過GlobalScope.launch創(chuàng)建一個(gè)協(xié)程A,A協(xié)程將在1秒后輸出World信息。2、主線程不受A協(xié)程的影響,繼續(xù)往下執(zhí)行,輸出hello信息。3、接著通過runBlocking創(chuàng)建了協(xié)程B,B協(xié)程中的代碼delay(5000L),會(huì)阻塞主線程5秒,4、在此期間A協(xié)程休息1秒后輸出World,B協(xié)程在休息5秒以后繼續(xù)運(yùn)行,主線程也解除阻塞輸出主線程運(yùn)行結(jié)束。5、runBlocking通常只用于啟動(dòng)最外層的協(xié)程,保證其他的協(xié)程順利執(zhí)行完任務(wù)。5、Kotlin中的協(xié)程1.2.3知識(shí)準(zhǔn)備(2)協(xié)程的取消如果主線程已經(jīng)執(zhí)行完畢,協(xié)程還在運(yùn)行,協(xié)程會(huì)直接結(jié)束運(yùn)行,因?yàn)閰f(xié)程的生命周期和主線程一樣。如果要避免出現(xiàn)這種情況,可以在主線程的后面通過sleep函數(shù)阻塞主線程,等待協(xié)程結(jié)束。這并不是一種很好的方法,因?yàn)閰f(xié)程需要執(zhí)行多少時(shí)間才結(jié)束,主線程并不知道,只能預(yù)估一個(gè)大于協(xié)程執(zhí)行的時(shí)間用于阻塞。更好的方法是通過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();5、Kotlin中的協(xié)程1.2.4任務(wù)實(shí)施下面以圖1-2-1所示的指南針表盤為例介紹圖形的繪制。具體步驟如下:1.添加依賴2.設(shè)置布局采用約束布局,放置2個(gè)按鈕,分別用于控制倒計(jì)時(shí)的開始和暫停,放置1個(gè)TextView用于顯示秒數(shù)。3.編寫java代碼countDown()函數(shù)用來實(shí)現(xiàn)倒計(jì)時(shí)。使用GlobalScope.launch創(chuàng)建一個(gè)協(xié)程,協(xié)程通過循環(huán)實(shí)現(xiàn)秒數(shù)的顯示,delay(1000L)非阻塞等待1秒。pauseCountDown()函數(shù)用來實(shí)現(xiàn)暫停。在該函數(shù)中調(diào)用job?.cancel()取消協(xié)程的執(zhí)行。這里的?.用來避免產(chǎn)生空指針異常。圖1-2-1“倒計(jì)時(shí)”效果圖1.2.4任務(wù)實(shí)施1.添加依賴。在build.gradle中的dependencies添加下面2行。1.2.4任務(wù)實(shí)施2.設(shè)置布局。采用約束布局,放置2個(gè)按鈕,分別用于控制倒計(jì)時(shí)的開始和暫停,放置1個(gè)TextView用于顯示秒數(shù)。代碼如右圖所示:1.2.4任務(wù)實(shí)施3.編寫java代碼。countDown()函數(shù)用來實(shí)現(xiàn)倒計(jì)時(shí)。使用GlobalScope.launch創(chuàng)建一個(gè)協(xié)程,協(xié)程通過循環(huán)實(shí)現(xiàn)秒數(shù)的顯示,delay(1000L)非阻塞等待1秒。pauseCountDown()函數(shù)用來實(shí)現(xiàn)暫停。在該函數(shù)中調(diào)用job?.cancel()取消協(xié)程的執(zhí)行。這里的?.用來避免產(chǎn)生空指針異常。1.2.5知識(shí)拓展Android項(xiàng)目中用了Kotlin插件后,Bulid的時(shí)候可能出現(xiàn)了以下問題:Couldnotinitializeclassernal.KotlinSourceSetProviderImplKt引發(fā)這個(gè)問題的原因是kotlin插件中kotlin版本號(hào)與項(xiàng)目中的kotlin版本號(hào)不一致。解決辦法是同步Kotlin版本號(hào)。步驟如下:1.打開Settings,查看Kotlin版本號(hào),如下圖所示的版本號(hào)為1.4.32。1.2.5知識(shí)拓展2.修改build.gradle文件中的kotlin版本號(hào),使其與插件的一致。如下圖所示。3.單擊“SyncNow”同步項(xiàng)目。如下圖所示。1.3項(xiàng)目實(shí)訓(xùn)1.3.1實(shí)訓(xùn)目的1.3.2實(shí)訓(xùn)內(nèi)容1.3.3問題引導(dǎo)1.3.4實(shí)訓(xùn)步驟1.3.5實(shí)訓(xùn)報(bào)告要求1.3.1實(shí)訓(xùn)目的將所學(xué)理論知識(shí)與實(shí)踐相結(jié)合,通過實(shí)訓(xùn)項(xiàng)目將面向?qū)ο?、集合等知識(shí)融合在一起,實(shí)現(xiàn)一個(gè)基于控制臺(tái)操作的學(xué)生信息管理程序。1.3.2實(shí)訓(xùn)內(nèi)容提供界面交互操作,程序運(yùn)行后顯示菜單項(xiàng),菜單項(xiàng)如下:1.顯示所有學(xué)生信息2.添加學(xué)生信息3.根據(jù)學(xué)號(hào)查找學(xué)生信息4.根據(jù)學(xué)號(hào)刪除學(xué)生信息5.根據(jù)學(xué)號(hào)修改學(xué)生信息6.退出系統(tǒng)選擇不同的菜單選項(xiàng),提供不同的操作。(1)如果輸入1,顯示集合類中所有學(xué)生信息記錄。(2)如果輸入2,從控制臺(tái)輸入學(xué)生信息保存到集合類中。(3)如果輸入3,等待用戶輸入學(xué)號(hào)后顯示該學(xué)生的信息。(4)如果輸入4,等待用戶輸入學(xué)號(hào)后從集合類中刪除該學(xué)生。(5)如果輸入5,等待用戶輸入學(xué)號(hào),然后根據(jù)學(xué)號(hào)去集合類中查找該學(xué)生,若能找到則修改該學(xué)生的信息。(6)如果輸入6,退出程序。圖1-3-1實(shí)訓(xùn)界面效果圖1.3.3問題引導(dǎo)完成本實(shí)訓(xùn)任務(wù)需要解決的主要問題有:如何創(chuàng)建類;如何定義函數(shù);如何添加集合里的元素和刪除集合里的元素。1.3.4實(shí)訓(xùn)步驟1.創(chuàng)建學(xué)生類,類的成員變量有id、姓名、性別、年齡。2.創(chuàng)建班級(jí)類,能對(duì)學(xué)生進(jìn)行增、刪、改、查、排序等操作。3.創(chuàng)建視圖類,能展示歡迎界面、退出界面、菜單界面,能調(diào)用班級(jí)類的相應(yīng)方法實(shí)現(xiàn)顯示所有學(xué)生、添加學(xué)生、修改學(xué)生信息、查找某位學(xué)生、刪除某位學(xué)生的功能。4.創(chuàng)建控制類,能調(diào)用視圖類的相應(yīng)方法實(shí)現(xiàn)響應(yīng)菜單項(xiàng)的功能。5.創(chuàng)建Main啟動(dòng)類,實(shí)例化控制類,調(diào)用其方法顯示菜單,并響應(yīng)菜單功能。1.3.5實(shí)訓(xùn)報(bào)告要求Android項(xiàng)目實(shí)訓(xùn)報(bào)告學(xué)號(hào)

姓名

項(xiàng)目名稱

實(shí)訓(xùn)過程要求寫出實(shí)訓(xùn)步驟,并貼出步驟中的關(guān)鍵代碼截圖。如填寫不下,可加附頁。遇到的問題以及解決的辦法問題1:描述遇到的問題解決辦法:描述解決的辦法問題2:描述遇到的問題解決辦法:描述解決的辦法…如填寫不下,可加附頁。本項(xiàng)目主要介紹了Kotlin開發(fā)環(huán)境的搭建和Kotlin編程基礎(chǔ)。要求讀者掌握以下兩個(gè)方面的知識(shí)和技能。1.掌握Kotlin開發(fā)環(huán)境的搭建。2.掌握Kotlin編程基礎(chǔ)。通過本課程,我們學(xué)習(xí)了本章小結(jié)第2章多媒體技術(shù)應(yīng)用

騰訊1+x安卓應(yīng)用開發(fā)(中級(jí))通過本課程的學(xué)習(xí)您將可以學(xué)習(xí)目標(biāo)知識(shí)目標(biāo)

掌握?qǐng)D形繪制的常用類和方法。理解屬性動(dòng)畫和逐幀動(dòng)畫的實(shí)現(xiàn)原理。掌握音頻播放的常用類和方法。掌握視頻播放的常用類和方法。掌握使用系統(tǒng)內(nèi)置Activity實(shí)現(xiàn)拍照和讀取相冊(cè)的方法。技能目標(biāo)

能夠掌握安卓平臺(tái)下圖形的繪制。能夠掌握安卓平臺(tái)下動(dòng)畫的實(shí)現(xiàn)。能夠控制安卓平臺(tái)下音頻播放。能夠控制安卓平臺(tái)下視頻播放。能夠控制安卓系統(tǒng)相機(jī)和相冊(cè)。能夠掌握安卓平臺(tái)下圖形的繪制。能夠掌握安卓平臺(tái)下動(dòng)畫的實(shí)現(xiàn)。能夠控制安卓平臺(tái)下音頻播放。能夠控制安卓平臺(tái)下視頻播放。能夠控制安卓系統(tǒng)相機(jī)和相冊(cè)。CERTIFICATION認(rèn)證考點(diǎn)項(xiàng)目引導(dǎo)項(xiàng)目名稱項(xiàng)目介紹多媒體技術(shù)應(yīng)用

目前智能手機(jī)的多媒體應(yīng)用主要包括動(dòng)畫的實(shí)現(xiàn)、音視頻的播放、拍照等。為了滿足多媒體應(yīng)用的需求,在本項(xiàng)目中,我們將完成圖形的繪制和處理、動(dòng)畫的實(shí)現(xiàn)、音頻視頻的播放、以及對(duì)安卓系統(tǒng)相機(jī)的使用等功能。2.1圖形的繪制2.2屬性動(dòng)畫的實(shí)現(xiàn)2.3逐幀動(dòng)畫的實(shí)現(xiàn)2.4音頻的播放2.5視頻的播放2.6相機(jī)和相冊(cè)的使用2.7項(xiàng)目實(shí)訓(xùn)目錄2.1圖形的繪制2.1.1任務(wù)描述2.1.2問題引導(dǎo)2.1.3知識(shí)準(zhǔn)備2.1.4任務(wù)實(shí)施2.1.5知識(shí)拓展2.1.1任務(wù)描述利用Canvas、Paint和Color等類繪制如圖2-1-1所示的指南針表盤。圖2-1-1指南針表盤2.1.2問題引導(dǎo)常見的二維圖形在Android中是如何繪制的呢?AndroidAPI提供一系列進(jìn)行2D繪圖的方法,這些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等類,具有繪制點(diǎn)、線、顏色、2D幾何圖形、圖像處理等功能。圖2-1-1指南針表盤2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。1.View類在Android中繪制圖形需要在Canvas上進(jìn)行,而使用Canvas需要使用View.onDraw()方法完成繪制工作,因此,需要定義一個(gè)android.view包中的View類的子類,然后復(fù)寫onDraw()方法。格式如下。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(1)publicvoiddrawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)drawBitmap的作用:繪制位圖bitmap要繪制的位圖,此值不能為null。left正在繪制的位圖左側(cè)的位置。top正在繪制的位圖頂部的位置。paint用于繪制位圖的畫筆,此值可能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(2)publicvoiddrawCircle(floatcx,floatcy,floatradius,Paintpaint)drawCircle的作用:繪制圓形cx要繪制的圓的中心的x坐標(biāo)。cy要繪制的圓的中心的y坐標(biāo)。radius要繪制的圓的半徑。paint用來畫圓的畫筆,此值不能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(3)publicvoiddrawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)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。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(4)publicvoiddrawOval(RectFoval,Paintpaint)drawOval的作用:繪制橢圓。oval要繪制的橢圓形矩形邊界,這個(gè)值不能是null。paint畫筆,此值不能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(5)publicvoiddrawPath(Pathpath,Paintpaint)drawPath的作用:繪制路徑path要繪制的路徑,此值不能是null。paint用于繪制路徑的畫筆,此值不能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(6)publicvoiddrawPoint(floatx,floaty,Paintpaint)drawPoint的作用:繪制點(diǎn)x要繪制的圓的x軸。y要繪制的圓的y軸。paint畫筆,此值不能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。2.Canvas類Canvas類相當(dāng)于畫布,定義在android.graphics包中,它給我們提供了一套畫圖API,常用的方法如下。(7)publicvoiddrawText(Stringtext,floatx,floaty,Paintpaint)drawText的作用:繪制文本text擬繪制的文本,此值不能是null。x正在繪制的文本的x坐標(biāo)y正在繪制的文本的y坐標(biāo)paint畫筆,此值不能是null。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(1)publicvoidsetARGB(inta,intr,intg,intb)setARGB的作用:設(shè)置顏色a畫筆的透明度,取值范圍0-255。r畫筆的紅色成分,取值范圍0-255。g畫筆的綠色成分,取值范圍0-255。b畫筆的藍(lán)色成分,取值范圍0-255。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(2)publicvoidsetAlpha(inta)setAlpha的作用:設(shè)置透明的a畫筆的透明度,取值范圍0-255。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(3)publicvoidsetAntiAlias(booleanaa)setAntiAlias的作用:設(shè)置抗鋸齒aa值為true時(shí),消除鋸齒值為false時(shí),保留鋸齒2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(4)publicvoidsetColor(intcolor)setColor的作用:設(shè)置顏色color畫筆的顏色,Android內(nèi)部定義有Color類,包含了一些常見顏色定義。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(5)publicvoidsetStyle(Paint.Stylestyle)setStyle的作用:設(shè)置繪制風(fēng)格stylePaint.Style.FILL:填充內(nèi)部Paint.Style.FILL_AND_STROKE:填充內(nèi)部和描邊Paint.Style.STROKE:僅描邊2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(6)publicvoidsetTextAlign(Paint.Alignalign)setTextAlign的作用:設(shè)置文本對(duì)齊方式alignPaint.Align.LEFT:左對(duì)齊Paint.Align.CENTER:居中對(duì)齊Paint.Align.RIGHT:右對(duì)齊2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(7)publicvoidsetTextScaleX(floatscaleX)setTextScaleX的作用:設(shè)置文本水平方向縮放比例scaleX文本水平方向的繪制比例。默認(rèn)值為1.0。值>1.0將放大。值<1.0將縮小。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(8)publicvoidsetTextSize(floattextSize)setTextSize的作用:設(shè)置文本大小textSize文本大小,以像素為單位。此值必須為>0。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(9)publicTypefacesetTypeface(Typefacetypeface)setTypeface的作用:設(shè)置文本樣式typefaceTypeface.BOLD為粗體,Typeface.BOLD_ITALIC為粗斜體,Typeface.ITALIC為斜體,Typeface.NORMAL為正常。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。3.Paint類Paint類相當(dāng)于畫筆,定義在android.graphics包中,可以用來設(shè)置繪圖時(shí)的顏色、字體等,常用的方法如下。(10)publicvoidsetUnderlineText(booleanunderlineText)setUnderlineText的作用:設(shè)置下劃線文字underlineText值為true時(shí),設(shè)置下劃線。值為false時(shí),取消下劃線。2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。4.Color類Color類在android.graphics包中。定義了很多常量的顏色值,可以通過Color.***使用。典型的顏色值如下。publicstaticfinalintBLACK=-16777216;//黑色publicstaticfinalintBLUE=-16776961;//藍(lán)色publicstaticfinalintCYAN=-16711681;//青色publicstaticfinalintGRAY=-7829368;//灰色publicstaticfinalintGREEN=-16711936;//綠色publicstaticfinalintRED=-65536;//紅色publicstaticfinalintTRANSPARENT=0;//透明色publicstaticfinalintWHITE=-1;//白色publicstaticfinalintYELLOW=-256;//黃色2.1.3知識(shí)準(zhǔn)備Android界面中可以繪制各種圖形,其中主要涉及4個(gè)類,分別是View、Canvas、Paint和Color。4.Color類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)三原色組成的顏色值2.1.4任務(wù)實(shí)施下面以圖2-1-1所示的指南針表盤為例介紹圖形的繪制。具體步驟如下:1.創(chuàng)建View類的子類CompassView2.創(chuàng)建CompassView類的構(gòu)造方法3.使用init()方法做初始化設(shè)置,準(zhǔn)備好畫筆4.復(fù)寫onDraw()方法畫圓形和畫字5.創(chuàng)建CompassActivity,將自定義的view顯示出來。圖2-1-1指南針表盤2.1.4任務(wù)實(shí)施1.創(chuàng)建View類的子類CompassView2.創(chuàng)建CompassView類的構(gòu)造方法2.1.4任務(wù)實(shí)施3.使用init()方法做初始化設(shè)置,準(zhǔn)備好畫筆2.1.4任務(wù)實(shí)施4.復(fù)寫onDraw()方法畫圓形和畫字2.1.4任務(wù)實(shí)施5.創(chuàng)建CompassActivity,將自定義的view顯示出來。2.1.5知識(shí)拓展1.利用Canvas類提供的不同方法可以繪制出不同的圖形。舉例如下:2.1.5知識(shí)拓展2.利用Bitmap、BitmapFactory和Matrix對(duì)圖形圖像進(jìn)行處理。(1)BitmapFactoryBitmapFactory是一個(gè)工具類,主要從不同的數(shù)據(jù)源(如文件、數(shù)據(jù)流和字節(jié)數(shù)組)來解析、創(chuàng)建Bitmap對(duì)象。常用方法如下:方法描述decodeFile(StringpathName)從指定文件中解析、創(chuàng)建Bitmap對(duì)象decodeStream(InputStreamis)從指定輸入流中解析、創(chuàng)建Bitmap對(duì)象decodeResource(Resourceres,intid)根據(jù)給定的資源ID,從指定資源中解析、創(chuàng)建Bitmap對(duì)象2.1.5知識(shí)拓展2.利用Bitmap、BitmapFactory和Matrix對(duì)圖形圖像進(jìn)行處理。(2)BitmapBItmap是Android系統(tǒng)中重要的圖像處理類,常用方法如下:方法描述createBitmap(intwidth,intheight,Configconfig)創(chuàng)建位圖width:要?jiǎng)?chuàng)建的圖片的寬度height:圖片的高度config:圖片的配置信息createBitmap(intcolors[],intoffset,intstride,intwidth,intheight,Configconfig)使用顏色數(shù)組創(chuàng)建一個(gè)指定寬高的位圖,顏色數(shù)組的個(gè)數(shù)為width*heightcreateBitmap(Bitmapsrc)使用源位圖創(chuàng)建一個(gè)新的BitmapcreateBitmap(Bitmapsrc,intx,inty,intwidth,intheight)從源位圖的指定坐標(biāo)開始”挖取“指定寬高的一塊圖像來創(chuàng)建新的Bitmap對(duì)象。createBitmap(Bitmapsrc,intx,inty,intwidth,intheight,Matrixm,booleanfilter)從源位圖的指定坐標(biāo)開始”挖取“指定寬高的一塊圖像來創(chuàng)建新的Bitmap對(duì)象,并按照Matrix規(guī)則進(jìn)行變換。2.1.5知識(shí)拓展2.利用Bitmap、BitmapFactory和Matrix對(duì)圖形圖像進(jìn)行處理。(3)Matrix使用該類提供的方法,可以對(duì)圖片添加特別的效果,如旋轉(zhuǎn)、縮放、傾斜等。Matrix類常用方法如下:方法描述setTranslate(floatdx,floatdy)控制Matrix進(jìn)行位移。setSkew(floatkx,floatky)控制Matrix進(jìn)行傾斜,kx、ky為X、Y方向上的比例。setSkew(floatkx,floatky,floatpx,floatpy)控制Matrix以px、py為軸心進(jìn)行傾斜,kx、ky為X、Y方向上的傾斜比例。setRotate(floatdegrees)控制Matrix進(jìn)行depress角度的旋轉(zhuǎn),軸心為(0,0)。setRotate(floatdegrees,floatpx,floatpy)控制Matrix進(jìn)行depress角度的旋轉(zhuǎn),軸心為(px,py)。setScale(floatsx,floatsy)設(shè)置Matrix進(jìn)行縮放,sx、sy為X、Y方向上的縮放比例。setScale(floatsx,floatsy,floatpx,floatpy)設(shè)置Matrix以(px,py)為軸心進(jìn)行縮放,sx、sy為X、Y方向上的縮放比例。2.1.5知識(shí)拓展2.利用Bitmap、BitmapFactory和Matrix對(duì)圖形圖像進(jìn)行處理。以下代碼實(shí)現(xiàn)了旋轉(zhuǎn)效果:2.2屬性動(dòng)畫的實(shí)現(xiàn)2.2.1任務(wù)描述2.2.2問題引導(dǎo)2.2.3知識(shí)準(zhǔn)備2.2.4任務(wù)實(shí)施2.2.5知識(shí)拓展2.2.1任務(wù)描述點(diǎn)擊相應(yīng)按鈕,實(shí)現(xiàn)四種屬性動(dòng)畫效果:透明度動(dòng)畫、旋轉(zhuǎn)動(dòng)畫、縮放動(dòng)畫和平移動(dòng)畫。如圖2-2-1所示。圖2-2-1屬性動(dòng)畫效果圖2.2.2問題引導(dǎo)屬性動(dòng)畫是如何實(shí)現(xiàn)動(dòng)畫效果的呢?屬性動(dòng)畫是通過對(duì)目標(biāo)對(duì)象進(jìn)行賦值并修改其屬性來實(shí)現(xiàn)的。例如修改目標(biāo)對(duì)象的Alpha屬性值,可以實(shí)現(xiàn)透明度的變化;修改目標(biāo)對(duì)象的BackgroundColor屬性值可以實(shí)現(xiàn)背景色的變化。圖2-2-1屬性動(dòng)畫效果圖2.2.3知識(shí)準(zhǔn)備1.簡(jiǎn)介ValueAnimator是整個(gè)屬性動(dòng)畫機(jī)制中最核心的一個(gè)類,負(fù)責(zé)計(jì)算初始值和結(jié)束值之間的動(dòng)畫過渡,我們只需要將初始值和結(jié)束值提供給ValueAnimator,并告訴它動(dòng)畫運(yùn)行的時(shí)長(zhǎng),ValueAnimator就會(huì)幫我們完成從初始值過渡到結(jié)束值的效果。此外,ValueAnimator還負(fù)責(zé)管理動(dòng)畫的播放次數(shù)、播放模式、以及對(duì)動(dòng)畫設(shè)置監(jiān)聽器等。例如,通過下面的代碼可以實(shí)現(xiàn)將一個(gè)值從0平滑過渡到1,重復(fù)播放3次,每次播放時(shí)長(zhǎng)是300毫秒。2.2.3知識(shí)準(zhǔn)備1.簡(jiǎn)介ObjectAnimator是ValueAnimator的一個(gè)子類,也是我們最常接觸到的類。ValueAnimator只是對(duì)值進(jìn)行了一個(gè)平滑的過渡,而ObjectAnimator則可以直接對(duì)任意對(duì)象的任意屬性進(jìn)行動(dòng)畫操作。通過調(diào)用ofFloat()方法可以創(chuàng)建一個(gè)ObjectAnimator的實(shí)例,該方法的第一個(gè)參數(shù)用來指定動(dòng)畫作用的目標(biāo)對(duì)象,第二個(gè)參數(shù)用來指定需要變化的是哪個(gè)屬性,第三個(gè)參數(shù)是長(zhǎng)度可變的float數(shù)據(jù),用來指定動(dòng)畫變化過程中屬性的值。下面分別對(duì)透明度、旋轉(zhuǎn)、縮放、平移四種屬性動(dòng)畫進(jìn)行講解。2.2.3知識(shí)準(zhǔn)備2.透明度動(dòng)畫透明度動(dòng)畫主要通過指定目標(biāo)對(duì)象的透明度在動(dòng)畫過程中的值,以及動(dòng)畫持續(xù)的時(shí)間來實(shí)現(xiàn)。代碼如下:2.2.3知識(shí)準(zhǔn)備3.旋轉(zhuǎn)動(dòng)畫旋轉(zhuǎn)動(dòng)畫主要通過指定目標(biāo)對(duì)象的旋轉(zhuǎn)角度在動(dòng)畫過程中的值,以及動(dòng)畫持續(xù)的時(shí)間來實(shí)現(xiàn)。代碼如下:默認(rèn)情況下,旋轉(zhuǎn)動(dòng)畫的中心點(diǎn)在目標(biāo)對(duì)象的中心位置。如果想修改中心點(diǎn),可以通過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)。2.2.3知識(shí)準(zhǔn)備4.縮放動(dòng)畫縮放動(dòng)畫主要通過指定目標(biāo)對(duì)象的scaleX和scaleY兩個(gè)屬性在動(dòng)畫過程中的值,以及動(dòng)畫持續(xù)的時(shí)間來實(shí)現(xiàn)。代碼如下:scale.play(scaleX).with(scaleY);表示同時(shí)執(zhí)行scaleX和scaleY動(dòng)畫。scale.play(scaleY).after(scaleX);表示先執(zhí)行scaleX,再執(zhí)行scaleY。2.2.3知識(shí)準(zhǔn)備5.平移動(dòng)畫平移動(dòng)畫主要通過指定目標(biāo)對(duì)象的translationX和translationY兩個(gè)屬性在動(dòng)畫過程中的值,以及動(dòng)畫持續(xù)的時(shí)間來實(shí)現(xiàn)。2.2.4任務(wù)實(shí)施下面以圖2-2-1的效果為例,介紹四種屬性動(dòng)畫的實(shí)現(xiàn)過程。1.創(chuàng)建程序創(chuàng)建一個(gè)應(yīng)用程序“多媒體的應(yīng)用”,指定包名為com.example.chapter05.demo01。2.導(dǎo)入圖片將一張?zhí)O果的圖片apple.png導(dǎo)入到drawable文件夾中。3.設(shè)置布局文件采用約束布局,放置1個(gè)RadioGroup,4個(gè)RadioButton和1個(gè)ImageView。4.編寫java代碼由于界面上有4個(gè)單選按鈕,所以使用當(dāng)前類實(shí)現(xiàn)RadioGroup.OnCheckedChangeListener接口,并重寫onCheckedChanged()方法,在該方法中,對(duì)4個(gè)單選按鈕,通過ObjectAnimator.ofFloat()方法分別實(shí)現(xiàn)透明度、旋轉(zhuǎn)、縮放和平移的動(dòng)畫效果。圖2-2-1屬性動(dòng)畫效果圖2.2.4任務(wù)實(shí)施布局文件:采用約束布局,放置1個(gè)RadioGroup,4個(gè)RadioButton和1個(gè)ImageView。2.2.4任務(wù)實(shí)施java代碼:由于界面上有4個(gè)單選按鈕,所以使用當(dāng)前類實(shí)現(xiàn)RadioGroup.OnCheckedChangeListener接口,并重寫onCheckedChanged()方法,在該方法中,對(duì)4個(gè)單選按鈕,通過ObjectAnimator.ofFloat()方法分別實(shí)現(xiàn)透明度、旋轉(zhuǎn)、縮放和平移的動(dòng)畫效果。2.2.4任務(wù)實(shí)施java代碼:由于界面上有4個(gè)單選按鈕,所以使用當(dāng)前類實(shí)現(xiàn)RadioGroup.OnCheckedChangeListener接口,并重寫onCheckedChanged()方法,在該方法中,對(duì)4個(gè)單選按鈕,通過ObjectAnimator.ofFloat()方法分別實(shí)現(xiàn)透明度、旋轉(zhuǎn)、縮放和平移的動(dòng)畫效果。2.2.5知識(shí)拓展動(dòng)畫1和動(dòng)畫2同時(shí)執(zhí)行animatorSet.play(animator1).with(animator2);動(dòng)畫2在動(dòng)畫1執(zhí)行完成后執(zhí)行animatorSet.play(animator1).after(animator2);動(dòng)畫1,2,3按順序執(zhí)行animatorSet.playSequentially(animator1,animator2,animator3);三個(gè)動(dòng)畫同時(shí)執(zhí)行animatorSet.playTogether(animator1,animator2,animator3);1.多個(gè)動(dòng)畫的執(zhí)行順序問題2.2.5知識(shí)拓展插值器用來確定動(dòng)畫是以線性運(yùn)動(dòng)還是非線性運(yùn)動(dòng)(如加速和減速)。調(diào)用Animator的setInterpolator()方法可以設(shè)置插值器。2.插值器的使用插值器舉例加速插值器:AccelerateInterpolator作用:變化的速度開始緩慢,然后加速。AccelerateInterpolatorinterpolator=newAccelerateInterpolator(10);animator.setInterpolator(interpolator);減速插值器:DecelerateInterpolator作用:變化的速度開始迅速,然后減速。DecelerateInterpolatorinterpolator=newDecelerateInterpolator(10);animator.setInterpolator(interpolator);AccelerateDecelerateInterpolator作用:變化的速度開始和結(jié)束緩慢,但中間加速。AccelerateDecelerateInterpolatorinterpolator=newAccelerateDecelerateInterpolator();animator.setInterpolator(interpolator);2.2.5知識(shí)拓展插值器用來確定動(dòng)畫是以線性運(yùn)動(dòng)還是非線性運(yùn)動(dòng)(如加速和減速)。調(diào)用Animator的setInterpolator()方法可以設(shè)置插值器。2.插值器的使用插值器舉例預(yù)期插值器:AnticipateInterpolator作用:先向反方向加速運(yùn)行,再向正方形加速運(yùn)行。AnticipateInterpolatorinterpolator=newAnticipateInterpolator(3);animator.setInterpolator(interpolator);彈跳插值器:BounceInterpolator作用:變化在最后反彈。BounceInterpolatorinterpolator=newBounceInterpolator();animator.setInterpolator(interpolator);周期插值器:CycleInterpolator作用:在指定的周期數(shù)上重復(fù)動(dòng)畫。變化率遵循正弦曲線模式。CycleInterpolatorinterpolator=newCycleInterpolator(3);animator.setInterpolator(interpolator);線性插值器:LinearInterpolator作用:變化率不變,動(dòng)畫勻速運(yùn)動(dòng)。LinearInterpolatorinterpolator=newLinearInterpolator();animator.setInterpolator(interpolator);2.3逐幀動(dòng)畫的實(shí)現(xiàn)2.3.1任務(wù)描述2.3.2問題引導(dǎo)2.3.3知識(shí)準(zhǔn)備2.3.4任務(wù)實(shí)施2.3.5知識(shí)拓展2.3.1任務(wù)描述點(diǎn)擊“播放”按鈕后,能將4幅小狗的圖像按照指定的順序進(jìn)行播放,形成小狗原地起跳的動(dòng)畫,同時(shí)“播放”二字變成“暫?!?,點(diǎn)擊“暫停”按鈕后,動(dòng)畫暫停播放。如圖2-3-1所示。圖2-3-1逐幀動(dòng)畫效果圖2.3.2問題引導(dǎo)什么是逐幀動(dòng)畫?逐幀動(dòng)畫指的是逐幀繪制幀內(nèi)容的動(dòng)畫,其實(shí)現(xiàn)原理是把事先準(zhǔn)備好的若干幅靜態(tài)圖像按照指定的順序進(jìn)行播放,利用人眼的“視覺暫留”性質(zhì),使用戶產(chǎn)生動(dòng)畫的錯(cuò)覺。每幅圖像稱為一幀。每幅圖像稱為一幀。圖2-3-1逐幀動(dòng)畫效果圖2.3.3知識(shí)準(zhǔn)備1.指定圖像的播放順序在drawable文件夾下創(chuàng)建xml文件,在該xml文件中指定圖像的播放順序和播放時(shí)長(zhǎng)。要求該xml文件的根節(jié)點(diǎn)是animation-list。每個(gè)item子節(jié)點(diǎn)表示一幀。代碼示例如下:以上代碼片段表示,先顯示img1圖像100毫秒,然后顯示img2圖像100毫秒。drawable屬性用來指定圖像資源。duration用來指定顯示此幀的時(shí)間(以毫秒為單位)。屬性名作用android:drawable用來指定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的可見性,默認(rèn)為false。2.3.3知識(shí)準(zhǔn)備2.AnimationDrawable類的使用該類用于創(chuàng)建逐幀動(dòng)畫的對(duì)象。通過View對(duì)象的getBackground()方法,可以獲得一個(gè)AnimationDrawable對(duì)象。然后調(diào)用AnimationDrawable的start()方法即可啟動(dòng)動(dòng)畫,調(diào)用stop()方法可以在當(dāng)前幀中停止動(dòng)畫。其他常用方法見下表。方法返回值類型方法名及作用voidaddFrame(Drawableframe,intduration)作用:將幀添加到動(dòng)畫中。booleanisRunning()作用:指示動(dòng)畫當(dāng)前是否正在運(yùn)行。voidsetOneShot(booleanoneShot)作用:設(shè)置動(dòng)畫是應(yīng)該播放一次還是重復(fù)播放。參數(shù)設(shè)為true表示只播放一次。voidstart()從第一幀開始播放動(dòng)畫。voidstop()在當(dāng)前幀中停止動(dòng)畫。2.3.4任務(wù)實(shí)施下面以圖2-3-1的效果為例,介紹四種屬性動(dòng)畫的實(shí)現(xiàn)過程。1.創(chuàng)建模塊打開應(yīng)用程序“多媒體的應(yīng)用”,創(chuàng)建一個(gè)新的模塊“frame_animation”。2.導(dǎo)入圖片將4張小狗的圖片dog1.gif、dog2.gif、dog3.gif、dog4.gif導(dǎo)入到drawable文件夾中。3.創(chuàng)建逐幀動(dòng)畫資源在“frame_animation”模塊的res/drawable文件夾中,創(chuàng)建一個(gè)frame_animation.xml文件,在該文件中定義逐幀動(dòng)畫用到的圖片及其顯示時(shí)間。4.設(shè)置布局采用約束布局,放置1個(gè)ImageView用于顯示動(dòng)畫效果,1個(gè)Button用于顯示播放動(dòng)畫的按鈕。5.編寫java代碼圖2-3-1逐幀動(dòng)畫效果圖2.3.4任務(wù)實(shí)施創(chuàng)建逐幀動(dòng)畫資源:在“frame_animation”模塊的res/drawable文件夾中,創(chuàng)建一個(gè)frame_animation.xml文件,在該文件中定義逐幀動(dòng)畫用到的圖片及其顯示時(shí)間。2.3.4任務(wù)實(shí)施布局文件:采用約束布局,放置1個(gè)ImageView用于顯示動(dòng)畫效果,1個(gè)Button用于顯示播放動(dòng)畫的按鈕。2.3.4任務(wù)實(shí)施java代碼:由于界面上的播放按鈕需要實(shí)現(xiàn)點(diǎn)擊事件,所以使用當(dāng)前類實(shí)現(xiàn)View.OnClickListener接口,并重寫onClick()方法,在該方法中實(shí)現(xiàn)動(dòng)畫的播放與停止。具體做法是,通過isRunning()判斷動(dòng)畫當(dāng)前是否正在播放,如果沒有播放,則調(diào)用start()方法播放動(dòng)畫,并將按鈕文字改為“暫?!?;否則,調(diào)用stop()方法停止播放動(dòng)畫,并將按鈕文字改為“播放”。2.3.4任務(wù)實(shí)施java代碼:當(dāng)Activity銷毀時(shí),也要停止動(dòng)畫的播放。具體做法是,重寫onDestroy()方法,在該方法中,通過isRunning()判斷動(dòng)畫當(dāng)前是否正在播放,如果是,則調(diào)用stop()方法停止播放動(dòng)畫,并調(diào)用clearAnimation()方法清空控件的動(dòng)畫。2.3.5知識(shí)拓展除了可以在XML文件中定義逐幀動(dòng)畫外,也可以通過java代碼定義逐幀動(dòng)畫。通過調(diào)用AnimationDrawable類的addFrame()方法即可添加每幀的圖像,并指定圖像的顯示時(shí)長(zhǎng)。核心代碼如下所示。2.4音頻的播放2.4.1任務(wù)描述2.4.2問題引導(dǎo)2.4.3知識(shí)準(zhǔn)備2.4.4任務(wù)實(shí)施2.4.5知識(shí)拓展2.4.1任務(wù)描述通過Switch開關(guān)按鈕控制背景音樂的播放。當(dāng)按鈕處于打開狀態(tài)時(shí),能播放音樂,并顯示文字“音樂播放中”,當(dāng)按鈕處于關(guān)閉狀態(tài)時(shí),能暫停音樂的播放,并顯示文字“音樂暫停播放”,當(dāng)Activity被銷毀時(shí),停止音樂的播放,并釋放播放器占用的資源。圖2-4-1背景音樂效果圖2.4.2問題引導(dǎo)音頻的播放是Android開發(fā)中較為常用的功能,Android是如何實(shí)現(xiàn)對(duì)音頻播放的支持的呢?Android提供的對(duì)音頻進(jìn)行處理的API包是android.media,media中包括了AudioManager、MediaPlayer等類,具有設(shè)置音頻類型,以及控制音頻的播放、暫停、停止等功能。圖2-4-1背景音樂效果圖2.4.3知識(shí)準(zhǔn)備1.MediaPlayer類的常用方法在Android中播放音頻文件一般是通過MediaPlayer類實(shí)現(xiàn)的,該類對(duì)多種格式的音頻文件提供了非常全面的控制方法,其常用方法見右表。方法返回值類型方法名及

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論