腾讯1 x安卓应用开发(中级)课程-课件_第1页
腾讯1 x安卓应用开发(中级)课程-课件_第2页
腾讯1 x安卓应用开发(中级)课程-课件_第3页
腾讯1 x安卓应用开发(中级)课程-课件_第4页
腾讯1 x安卓应用开发(中级)课程-课件_第5页
已阅读5页,还剩534页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章Android基础和环境搭建

腾讯1+x安卓应用开发(中级)通过本课程的学习您将可以学习目标知识目标

掌握Kotlin基础语法,能掌握Kotlin类型与表达式。理解Kotlin泛型和注解。掌握Kotlin的反射。掌握Kotlin中的协程。技能目标

能够进行Kotlin安装包的下载与安装。能够进行Kotlin环境的搭建与配置。能够利用常见集成开发环境创建工程项目,

并能实现程序正确编译和运行。能够进行Kotlin安装包的下载与安装。能够进行Kotlin环境的搭建与配置。能够利用常见集成开发环境创建工程项目,并能实现程序正确编译和运行。能够掌握Kotlin基础语法,能掌握Kotlin类型与表达式。能够理解Kotlin泛型和注解。能够掌握Kotlin的反射。能够掌握Kotlin中的协程。CERTIFICATION认证考点项目引导项目名称项目介绍Android基础和环境搭建

2017年,Google宣布Kotlin作为Android官方开发语言,因此,我们有必要掌握kotlin的基础知识。在本项目中,我们将完成kotlin开发环境的搭建,并熟悉kotlin的基础知识。1.1Kotlin简介及开发环境搭建1.2Kotlin基础1.3项目实训目录1.1Kotlin简介及开发环境搭建1.1.1任务描述1.1.2问题引导1.1.3知识准备1.1.4任务实施1.1.5知识拓展1.1.1任务描述在AndroidStudio中安装Kotlin插件,搭建Kotlin开发环境,以便能在AndroidStudio中使用Kotlin编写代码。1.1.2问题引导默认情况下,AndroidStudio安装完成后,还不能使用Kotlin编写代码。要想使用Kotlin,必须安装Kotlin插件。1.1.3知识准备Kotlin是JetBrains公司在2010年推出的一种基于JVM的静态类型编程语言。Kotlin可以编译成Java字节码,也可以编译成JavaScript,以便在没有JVM的设备上运行。2017年,Google宣布Kotlin是Android官方开发语言。使用Kotlin语言,对于安卓开发来说,主要有下面几个优势。减少空指针异常。减少代码量:同样的功能Kotlin开发要比Java少50%甚至更多。提升开发效率:增加了许多现代高级语言的语法特性,使得开发效率大大提升。实现与Java语言的无缝连接:Kotlin可以直接调用和使用Java编写的代码,也可以无缝使用Java第三方开源库1.1.4任务实施在AndroidStudio中安装Kotlin开发环境,需要先安装Kotlin插件,安装步骤如下:1.单击File|Setting,弹出setting面板,如图1-1-1所示。图1-1-1setting面板1.1.4任务实施在AndroidStudio中安装Kotlin开发环境,需要先安装Kotlin插件,安装步骤如下:2.单击Plugins,输入kotlin进行搜索,如图1-1-2。图1-1-2搜索kotlin3.单击Install后等待安装完成即可。1.1.5知识拓展Kotlin插件还可以离线下载安装。步骤如下:1.访问JetBrains官网,搜索kotlin插件。如图1-1-3所示。2.选择kotlin插件。如图1-1-4所示。图1-1-3在JetBrains官网搜索kotlin图1-1-4选择kotlin插件1.1.5知识拓展Kotlin插件还可以离线下载安装。步骤如下:3.选择想要的版本号,单击Download下载。如图1-1-5所示。图1-1-5下载插件1.1.5知识拓展Kotlin插件还可以离线下载安装。步骤如下:4.在AndroidStudio中,单击File|Setting,弹出setting面板,单击Plugins,单击右边齿轮,选择InstallpluginformDisk...导入插件。如图1-1-6所示。图1-1-6导入插件1.1.5知识拓展Kotlin插件还可以离线下载安装。步骤如下:5.选择下载好的插件路径,单击OK安装插件。如图1-1-7所示。安装完成后重启AndroidStudio即可。图1-1-7选择下载好的插件路径1.2Kotlin基础1.2.1任务描述1.2.2问题引导1.2.3知识准备1.2.4任务实施1.2.5知识拓展1.2.1任务描述使用Kotlin语言实现倒计时功能。点击按钮“开始倒计时”,开始30秒倒计时;点击按钮“暂停倒计时”,倒计时暂停;在暂停情况下再次点击按钮“开始倒计时”,从暂停时的秒数开始倒计时。图1-2-1“倒计时”效果图1.2.2问题引导如果所有代码都写在主线程会导致在倒计时过程中无法点击按钮的情况发生,因此考虑使用Kotlin的协程实现倒计时功能,协程支持挂起,不会使正在运行的线程阻塞。图1-2-1“倒计时”效果图1.2.3知识准备1.Kotlin基础语法(1)注释kotlin支持单行和多行注释,实例如下://这是一个单行注释/*这是一个多行的块注释。*/(2)包声明kotlin代码文件的开头一般为包的声明:packagecom.test.mainimportjava.util.*funtest(){}classStu{}上例中test()的全名是:com.test.main.test(),类Stu的全名是:com.test.main.Stu。1.2.3知识准备1.Kotlin基础语法(3)默认导入在kotlin文件中默认会导入以下包:kotlin.*kotlin.annotation.*kotlin.collections.*parisons.*kotlin.io.*kotlin.ranges.*kotlin.sequences.*kotlin.text.*1.2.3知识准备1.Kotlin基础语法(4)函数定义①函数定义使用关键字fun,函数参数格式为:参数:类型。返回值类型的定义是在函数头后面加冒号:返回值类型。例如:funsum(a:Int,b:Int):Int{//Int参数,返回值Intreturna+b}②表达式可以作为函数体,函数返回值类型可以自动推断,例如:funsum(x:Int,y:Int)=x+ypublicfunsum(x:Int,y:Int):Int=x+y③无返回值的函数(类似Java中的void),有两种形式,一种是用Unit类型修饰,另外一种是直接省略不写,例如:fundoSomething(){}fundoSomething():Unit{}1.2.3知识准备1.Kotlin基础语法(5)可变长参数函数函数的可变长参数可以用vararg关键字进行标识,例如:程序运行后输出:aaabbbccc1.2.3知识准备1.Kotlin基础语法(6)lambda(匿名函数)lambda就是将一小段代码封装成匿名函数,以参数值的方式传递到函数中,供函数使用,例如:程序运行后输出:1上面的代码在main函数中定义了一个求最小值的匿名函数min。1.2.3知识准备1.Kotlin基础语法(7)定义常量与变量在kotlin中,变量与常量在定义的时候可以不用赋初始值,但是在使用前一定要初始化。在kotlin中,变量的定义使用关键字var,格式为:var<标识符>:<类型>=<初始化值>例如:vara:Int=12在kotlin中,常量的定义使用关键字val,格式为:val<标识符>:<类型>=<初始化值>例如:vala:Int=12

Kotlin的编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。例如:vara=121.2.3知识准备1.Kotlin基础语法(8)区间表达式区间表达式由具有操作符形式..的rangeTo函数辅以in和!in形成。区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:for(iin1..4)print(i)//输出“1234”for(iin4..1)print(i)//什么都不输出if(iin1..10){//等同于1<=i&&i<=10println(i)}//使用step指定步长for(iin1..4step2)print(i)//输出“13”for(iin4downTo1step2)print(i)//输出“42”//使用until函数排除结束元素for(iin1until10){//iin[1,10)排除了10println(i)}1.2.3知识准备2.Kotlin基本数据类型(1)基本数据类型Kotlin的基本数值类型包括Byte、Short、Int、Long、Float、Double等。见表1-1。不同于Java的是,字符不属于数值类型,是一个独立的数据类型。数据类型长度(位)Double64Float32Long64Int32Short16Byte8表1-1基本数据类型1.2.3知识准备2.Kotlin基本数据类型(2)字符类型字符类型用Char描述,Kotlin中的Char不能直接和数字操作,Char必需是单引号'包含起来的。比如普通字符'0','a'。varch:Char='1'vara:Int=ch//错误如果要获取字符的编码,可以:vara:Int=ch.code(3)布尔类型布尔用Boolean类型表示,它有两个值:true和false。1.2.3知识准备2.Kotlin基本数据类型(4)字符串类型字符串类型用String描述,可以通过[]获取某个字符,例如:程序运行后输出:1231.2.3知识准备2.Kotlin基本数据类型(4)字符串类型Kotlin支持三个引号"""扩起来的字符串,支持多行字符串,比如:程序运行后输出:1234561.2.3知识准备3.Kotlin泛型和注解泛型,即"参数化类型",将类型参数化,可以用在类,接口,方法上。(1)泛型类的基本使用泛型类指的就是在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而在类使用时再进行属性类型的定义。定义泛型类,就是在类名之后、主构造函数之前用尖括号括起的大写字母代表某种数据类型。在定义泛型类型的变量时,可以完整地写明类型参数,如果编译器可以自动推定类型参数,也可以省略类型参数。例如:程序运行后,输出:1hello1.2.3知识准备3.Kotlin泛型和注解泛型,即"参数化类型",将类型参数化,可以用在类,接口,方法上。(2)泛型函数的基本使用在定义泛型函数时,泛型函数的类型参数要放在函数名的前面。例如:程序运行后,输出:1hellofun<E>test(num:E):E{returnnum;}funmain(args:Array<String>){print(test<Int>(1))print(test<String>("hello"))}1.2.3知识准备3.Kotlin泛型和注解泛型,即"参数化类型",将类型参数化,可以用在类,接口,方法上。(3)Kotlin中的注解①注解的基础知识注解就是向代码中添加元数据。通过在类名前添加annotation来声明注解。Kotlin中有以下四种元注解(用来定义注解的注解):@Target:限定注解标记的目标(属性、方法、类、扩展等等)@Retention:限定注解是否存储到字节码文件中;在运行时通过反射是否可见(默认情况下以上两个条件均为真)@Repeatable:允许在同一个元素上重复使用同一个注解@MustBeDocumented:指定该注解是公有API的一部分,并且应该包含在生成的API文档中显示的类或方法的签名中。1.2.3知识准备3.Kotlin泛型和注解泛型,即"参数化类型",将类型参数化,可以用在类,接口,方法上。(3)Kotlin中的注解在Kotlin中定义一个注解类,需要使用annotation关键字。例如:@Target(AnnotationTarget.CLASS,AnnotationTarget.PROPERTY)@Retention(AnnotationRetention.RUNTIME)annotationclassValue通过定义,@Value注解可以用来修饰类和属性,并且这个注解在运行时可见,可以通过反射技术获取@Value注解的相关信息。例如:右边的例子中,@Value可以注解在类Stu和属性name,age上面。1.2.3知识准备3.Kotlin泛型和注解泛型,即"参数化类型",将类型参数化,可以用在类,接口,方法上。(3)Kotlin中的注解②带属性的注解在kotlin中,可以为注解添加属性。例如:上面的例子中,@Value具有属性value,在给类进行注解时,需要传递参数给属性,这些属性值一般只有在程序运算时通过反射技术获得得到才有意义。1.2.3知识准备4.Kotlin的反射反射是指计算机程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。下面对Kotlin中的反射技术进行一个简要介绍。(1)获取KClasskotlin的KClass和java的Class可以看作同一个含义的类型。可以通过两种方法获取类的KClass:①类名().javaClass.kotlin②类名::class例如:程序运行后输出:true在该例中通过两种方法获取Person的KClass。1.2.3知识准备4.Kotlin的反射(2)通过反射创建对象在Kotlin中可以通过两种方法创建对象,这两种方法都需要对应的类提供无参构造函数。以上面的例子为例,创建Person对象:1.2.3知识准备4.Kotlin的反射(3)通过反射获取对象的成员、方法等要通过反射技术获取对象的成员变量可以使用:KClass.declaredMemberProperties,获取成员方法通过KClass.declaredFunctions。下面的例子将对这两种操作进行演示:1.2.3知识准备4.Kotlin的反射(3)通过反射获取对象的成员、方法等要通过反射技术获取对象的成员变量可以使用:KClass.declaredMemberProperties,获取成员方法通过KClass.declaredFunctions。下面的例子将对这两种操作进行演示:1.2.3知识准备5、Kotlin中的协程协程(Coroutine)也叫微线程,也称为轻量级

Thread,是一种新的多任务并发的操作手段。它是运行在单线程中的并发程序。能大幅度提高并发性能。协程开发包在

kotlinx.coroutines

中,这个包可以build.gradle中通过dependencies引入。如:dependencies{implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2")}1.2.3知识准备5、Kotlin中的协程(1)

协程的启动协程的启动有多种,下面将对GlobalScope.launch()和runBlocking()两种方式进行介绍。

1)方式一、GlobalScope.launchGlobalScope.launch创建的协程的生命周期受主应用程序的生命周期期限,如果主应用程序执行结束,由GlobalScope.launch创建的协程即使还没执行完毕,也会直接退出。1.2.3知识准备5、Kotlin中的协程

1)方式一、GlobalScope.launch1、通过GlobalScope.launch创建一个协程2、协程首先通过delay(1000L)非阻塞等待1秒,再输出World!信息。3、在协程非阻塞等待的时候,主线程运行println("Hello,--->"+Thread.currentThread().name)4、主线程Thread.sleep(2000),阻塞主线程2秒钟,等待协程完成任务。程序运行后输出:Hello,--->mainWorld!--->DefaultDispatcher-worker-11.2.3知识准备

1)方式一、GlobalScope.launch如果把Thread.sleep(2000)这行代码去掉,则程序执行结果是:Hello,--->main因为主线程输出hello信息以后就直接结束,而通过GlobalScope.launch创建的协程的生命周期和主线程一样,所以也跟着主线程结束。GlobalScope.launch是创建协程最常用的方式。程序运行后输出:Hello,--->main5、Kotlin中的协程1.2.3知识准备2)方式二、runBlockingrunBlocking函数和launch函数的不同点是会阻塞调用者线程直到协程完成。

程序运行后输出:Hello,World!主线程运行结束

1、通过GlobalScope.launch创建一个协程A,A协程将在1秒后输出World信息。2、主线程不受A协程的影响,继续往下执行,输出hello信息。3、接着通过runBlocking创建了协程B,B协程中的代码delay(5000L),会阻塞主线程5秒,4、在此期间A协程休息1秒后输出World,B协程在休息5秒以后继续运行,主线程也解除阻塞输出主线程运行结束。5、runBlocking通常只用于启动最外层的协程,保证其他的协程顺利执行完任务。5、Kotlin中的协程1.2.3知识准备(2)协程的取消如果主线程已经执行完毕,协程还在运行,协程会直接结束运行,因为协程的生命周期和主线程一样。如果要避免出现这种情况,可以在主线程的后面通过sleep函数阻塞主线程,等待协程结束。这并不是一种很好的方法,因为协程需要执行多少时间才结束,主线程并不知道,只能预估一个大于协程执行的时间用于阻塞。更好的方法是通过join()函数实现。GlobalScope.launch函数的返回值是Job类型,Job的join函数可以在主线程和协程之间实现同步。程序运行后输出:helloWorld!--->DefaultDispatcher-worker-1end如果要取消协程的执行可以调用job.cancel();5、Kotlin中的协程1.2.4任务实施下面以图1-2-1所示的指南针表盘为例介绍图形的绘制。具体步骤如下:1.添加依赖2.设置布局采用约束布局,放置2个按钮,分别用于控制倒计时的开始和暂停,放置1个TextView用于显示秒数。3.编写java代码countDown()函数用来实现倒计时。使用GlobalScope.launch创建一个协程,协程通过循环实现秒数的显示,delay(1000L)非阻塞等待1秒。pauseCountDown()函数用来实现暂停。在该函数中调用job?.cancel()取消协程的执行。这里的?.用来避免产生空指针异常。图1-2-1“倒计时”效果图1.2.4任务实施1.添加依赖。在build.gradle中的dependencies添加下面2行。1.2.4任务实施2.设置布局。采用约束布局,放置2个按钮,分别用于控制倒计时的开始和暂停,放置1个TextView用于显示秒数。代码如右图所示:1.2.4任务实施3.编写java代码。countDown()函数用来实现倒计时。使用GlobalScope.launch创建一个协程,协程通过循环实现秒数的显示,delay(1000L)非阻塞等待1秒。pauseCountDown()函数用来实现暂停。在该函数中调用job?.cancel()取消协程的执行。这里的?.用来避免产生空指针异常。1.2.5知识拓展Android项目中用了Kotlin插件后,Bulid的时候可能出现了以下问题:Couldnotinitializeclassernal.KotlinSourceSetProviderImplKt引发这个问题的原因是kotlin插件中kotlin版本号与项目中的kotlin版本号不一致。解决办法是同步Kotlin版本号。步骤如下:1.打开Settings,查看Kotlin版本号,如下图所示的版本号为1.4.32。1.2.5知识拓展2.修改build.gradle文件中的kotlin版本号,使其与插件的一致。如下图所示。3.单击“SyncNow”同步项目。如下图所示。1.3项目实训1.3.1实训目的1.3.2实训内容1.3.3问题引导1.3.4实训步骤1.3.5实训报告要求1.3.1实训目的将所学理论知识与实践相结合,通过实训项目将面向对象、集合等知识融合在一起,实现一个基于控制台操作的学生信息管理程序。1.3.2实训内容提供界面交互操作,程序运行后显示菜单项,菜单项如下:1.显示所有学生信息2.添加学生信息3.根据学号查找学生信息4.根据学号删除学生信息5.根据学号修改学生信息6.退出系统选择不同的菜单选项,提供不同的操作。(1)如果输入1,显示集合类中所有学生信息记录。(2)如果输入2,从控制台输入学生信息保存到集合类中。(3)如果输入3,等待用户输入学号后显示该学生的信息。(4)如果输入4,等待用户输入学号后从集合类中删除该学生。(5)如果输入5,等待用户输入学号,然后根据学号去集合类中查找该学生,若能找到则修改该学生的信息。(6)如果输入6,退出程序。图1-3-1实训界面效果图1.3.3问题引导完成本实训任务需要解决的主要问题有:如何创建类;如何定义函数;如何添加集合里的元素和删除集合里的元素。1.3.4实训步骤1.创建学生类,类的成员变量有id、姓名、性别、年龄。2.创建班级类,能对学生进行增、删、改、查、排序等操作。3.创建视图类,能展示欢迎界面、退出界面、菜单界面,能调用班级类的相应方法实现显示所有学生、添加学生、修改学生信息、查找某位学生、删除某位学生的功能。4.创建控制类,能调用视图类的相应方法实现响应菜单项的功能。5.创建Main启动类,实例化控制类,调用其方法显示菜单,并响应菜单功能。1.3.5实训报告要求Android项目实训报告学号

姓名

项目名称

实训过程要求写出实训步骤,并贴出步骤中的关键代码截图。如填写不下,可加附页。遇到的问题以及解决的办法问题1:描述遇到的问题解决办法:描述解决的办法问题2:描述遇到的问题解决办法:描述解决的办法…如填写不下,可加附页。本项目主要介绍了Kotlin开发环境的搭建和Kotlin编程基础。要求读者掌握以下两个方面的知识和技能。1.掌握Kotlin开发环境的搭建。2.掌握Kotlin编程基础。通过本课程,我们学习了本章小结第2章多媒体技术应用

腾讯1+x安卓应用开发(中级)通过本课程的学习您将可以学习目标知识目标

掌握图形绘制的常用类和方法。理解属性动画和逐帧动画的实现原理。掌握音频播放的常用类和方法。掌握视频播放的常用类和方法。掌握使用系统内置Activity实现拍照和读取相册的方法。技能目标

能够掌握安卓平台下图形的绘制。能够掌握安卓平台下动画的实现。能够控制安卓平台下音频播放。能够控制安卓平台下视频播放。能够控制安卓系统相机和相册。能够掌握安卓平台下图形的绘制。能够掌握安卓平台下动画的实现。能够控制安卓平台下音频播放。能够控制安卓平台下视频播放。能够控制安卓系统相机和相册。CERTIFICATION认证考点项目引导项目名称项目介绍多媒体技术应用

目前智能手机的多媒体应用主要包括动画的实现、音视频的播放、拍照等。为了满足多媒体应用的需求,在本项目中,我们将完成图形的绘制和处理、动画的实现、音频视频的播放、以及对安卓系统相机的使用等功能。2.1图形的绘制2.2属性动画的实现2.3逐帧动画的实现2.4音频的播放2.5视频的播放2.6相机和相册的使用2.7项目实训目录2.1图形的绘制2.1.1任务描述2.1.2问题引导2.1.3知识准备2.1.4任务实施2.1.5知识拓展2.1.1任务描述利用Canvas、Paint和Color等类绘制如图2-1-1所示的指南针表盘。图2-1-1指南针表盘2.1.2问题引导常见的二维图形在Android中是如何绘制的呢?AndroidAPI提供一系列进行2D绘图的方法,这些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等类,具有绘制点、线、颜色、2D几何图形、图像处理等功能。图2-1-1指南针表盘2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。1.View类在Android中绘制图形需要在Canvas上进行,而使用Canvas需要使用View.onDraw()方法完成绘制工作,因此,需要定义一个android.view包中的View类的子类,然后复写onDraw()方法。格式如下。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(1)publicvoiddrawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)drawBitmap的作用:绘制位图bitmap要绘制的位图,此值不能为null。left正在绘制的位图左侧的位置。top正在绘制的位图顶部的位置。paint用于绘制位图的画笔,此值可能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(2)publicvoiddrawCircle(floatcx,floatcy,floatradius,Paintpaint)drawCircle的作用:绘制圆形cx要绘制的圆的中心的x坐标。cy要绘制的圆的中心的y坐标。radius要绘制的圆的半径。paint用来画圆的画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(3)publicvoiddrawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)drawLine的作用:绘制线条startX线条起点的x坐标。startY线条起点的y坐标。stopX线条终点的x坐标。stopY线条终点的y坐标。paint用于绘制线条的画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(4)publicvoiddrawOval(RectFoval,Paintpaint)drawOval的作用:绘制椭圆。oval要绘制的椭圆形矩形边界,这个值不能是null。paint画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(5)publicvoiddrawPath(Pathpath,Paintpaint)drawPath的作用:绘制路径path要绘制的路径,此值不能是null。paint用于绘制路径的画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(6)publicvoiddrawPoint(floatx,floaty,Paintpaint)drawPoint的作用:绘制点x要绘制的圆的x轴。y要绘制的圆的y轴。paint画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(7)publicvoiddrawText(Stringtext,floatx,floaty,Paintpaint)drawText的作用:绘制文本text拟绘制的文本,此值不能是null。x正在绘制的文本的x坐标y正在绘制的文本的y坐标paint画笔,此值不能是null。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(1)publicvoidsetARGB(inta,intr,intg,intb)setARGB的作用:设置颜色a画笔的透明度,取值范围0-255。r画笔的红色成分,取值范围0-255。g画笔的绿色成分,取值范围0-255。b画笔的蓝色成分,取值范围0-255。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(2)publicvoidsetAlpha(inta)setAlpha的作用:设置透明的a画笔的透明度,取值范围0-255。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(3)publicvoidsetAntiAlias(booleanaa)setAntiAlias的作用:设置抗锯齿aa值为true时,消除锯齿值为false时,保留锯齿2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(4)publicvoidsetColor(intcolor)setColor的作用:设置颜色color画笔的颜色,Android内部定义有Color类,包含了一些常见颜色定义。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(5)publicvoidsetStyle(Paint.Stylestyle)setStyle的作用:设置绘制风格stylePaint.Style.FILL:填充内部Paint.Style.FILL_AND_STROKE:填充内部和描边Paint.Style.STROKE:仅描边2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(6)publicvoidsetTextAlign(Paint.Alignalign)setTextAlign的作用:设置文本对齐方式alignPaint.Align.LEFT:左对齐Paint.Align.CENTER:居中对齐Paint.Align.RIGHT:右对齐2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(7)publicvoidsetTextScaleX(floatscaleX)setTextScaleX的作用:设置文本水平方向缩放比例scaleX文本水平方向的绘制比例。默认值为1.0。值>1.0将放大。值<1.0将缩小。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(8)publicvoidsetTextSize(floattextSize)setTextSize的作用:设置文本大小textSize文本大小,以像素为单位。此值必须为>0。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(9)publicTypefacesetTypeface(Typefacetypeface)setTypeface的作用:设置文本样式typefaceTypeface.BOLD为粗体,Typeface.BOLD_ITALIC为粗斜体,Typeface.ITALIC为斜体,Typeface.NORMAL为正常。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(10)publicvoidsetUnderlineText(booleanunderlineText)setUnderlineText的作用:设置下划线文字underlineText值为true时,设置下划线。值为false时,取消下划线。2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。4.Color类Color类在android.graphics包中。定义了很多常量的颜色值,可以通过Color.***使用。典型的颜色值如下。publicstaticfinalintBLACK=-16777216;//黑色publicstaticfinalintBLUE=-16776961;//蓝色publicstaticfinalintCYAN=-16711681;//青色publicstaticfinalintGRAY=-7829368;//灰色publicstaticfinalintGREEN=-16711936;//绿色publicstaticfinalintRED=-65536;//红色publicstaticfinalintTRANSPARENT=0;//透明色publicstaticfinalintWHITE=-1;//白色publicstaticfinalintYELLOW=-256;//黄色2.1.3知识准备Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。4.Color类Color类还定义了一些静态方法,如下所示。publicstaticintalpha(intcolor))//透明度分量publicstaticintred(intcolor))//红色分量publicstaticintgreen(intcolor))//绿色分量publicstaticintblue(intcolor)//蓝色分量publicstaticintrgb(intred,intgreen,intblue)//由红绿蓝三原色组成的颜色值publicstaticintargb(intalpha,intred,intgreen,intblue)//由透明度和红绿蓝三原色组成的颜色值2.1.4任务实施下面以图2-1-1所示的指南针表盘为例介绍图形的绘制。具体步骤如下:1.创建View类的子类CompassView2.创建CompassView类的构造方法3.使用init()方法做初始化设置,准备好画笔4.复写onDraw()方法画圆形和画字5.创建CompassActivity,将自定义的view显示出来。图2-1-1指南针表盘2.1.4任务实施1.创建View类的子类CompassView2.创建CompassView类的构造方法2.1.4任务实施3.使用init()方法做初始化设置,准备好画笔2.1.4任务实施4.复写onDraw()方法画圆形和画字2.1.4任务实施5.创建CompassActivity,将自定义的view显示出来。2.1.5知识拓展1.利用Canvas类提供的不同方法可以绘制出不同的图形。举例如下:2.1.5知识拓展2.利用Bitmap、BitmapFactory和Matrix对图形图像进行处理。(1)BitmapFactoryBitmapFactory是一个工具类,主要从不同的数据源(如文件、数据流和字节数组)来解析、创建Bitmap对象。常用方法如下:方法描述decodeFile(StringpathName)从指定文件中解析、创建Bitmap对象decodeStream(InputStreamis)从指定输入流中解析、创建Bitmap对象decodeResource(Resourceres,intid)根据给定的资源ID,从指定资源中解析、创建Bitmap对象2.1.5知识拓展2.利用Bitmap、BitmapFactory和Matrix对图形图像进行处理。(2)BitmapBItmap是Android系统中重要的图像处理类,常用方法如下:方法描述createBitmap(intwidth,intheight,Configconfig)创建位图width:要创建的图片的宽度height:图片的高度config:图片的配置信息createBitmap(intcolors[],intoffset,intstride,intwidth,intheight,Configconfig)使用颜色数组创建一个指定宽高的位图,颜色数组的个数为width*heightcreateBitmap(Bitmapsrc)使用源位图创建一个新的BitmapcreateBitmap(Bitmapsrc,intx,inty,intwidth,intheight)从源位图的指定坐标开始”挖取“指定宽高的一块图像来创建新的Bitmap对象。createBitmap(Bitmapsrc,intx,inty,intwidth,intheight,Matrixm,booleanfilter)从源位图的指定坐标开始”挖取“指定宽高的一块图像来创建新的Bitmap对象,并按照Matrix规则进行变换。2.1.5知识拓展2.利用Bitmap、BitmapFactory和Matrix对图形图像进行处理。(3)Matrix使用该类提供的方法,可以对图片添加特别的效果,如旋转、缩放、倾斜等。Matrix类常用方法如下:方法描述setTranslate(floatdx,floatdy)控制Matrix进行位移。setSkew(floatkx,floatky)控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。setSkew(floatkx,floatky,floatpx,floatpy)控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。setRotate(floatdegrees)控制Matrix进行depress角度的旋转,轴心为(0,0)。setRotate(floatdegrees,floatpx,floatpy)控制Matrix进行depress角度的旋转,轴心为(px,py)。setScale(floatsx,floatsy)设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。setScale(floatsx,floatsy,floatpx,floatpy)设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。2.1.5知识拓展2.利用Bitmap、BitmapFactory和Matrix对图形图像进行处理。以下代码实现了旋转效果:2.2属性动画的实现2.2.1任务描述2.2.2问题引导2.2.3知识准备2.2.4任务实施2.2.5知识拓展2.2.1任务描述点击相应按钮,实现四种属性动画效果:透明度动画、旋转动画、缩放动画和平移动画。如图2-2-1所示。图2-2-1属性动画效果图2.2.2问题引导属性动画是如何实现动画效果的呢?属性动画是通过对目标对象进行赋值并修改其属性来实现的。例如修改目标对象的Alpha属性值,可以实现透明度的变化;修改目标对象的BackgroundColor属性值可以实现背景色的变化。图2-2-1属性动画效果图2.2.3知识准备1.简介ValueAnimator是整个属性动画机制中最核心的一个类,负责计算初始值和结束值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并告诉它动画运行的时长,ValueAnimator就会帮我们完成从初始值过渡到结束值的效果。此外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。例如,通过下面的代码可以实现将一个值从0平滑过渡到1,重复播放3次,每次播放时长是300毫秒。2.2.3知识准备1.简介ObjectAnimator是ValueAnimator的一个子类,也是我们最常接触到的类。ValueAnimator只是对值进行了一个平滑的过渡,而ObjectAnimator则可以直接对任意对象的任意属性进行动画操作。通过调用ofFloat()方法可以创建一个ObjectAnimator的实例,该方法的第一个参数用来指定动画作用的目标对象,第二个参数用来指定需要变化的是哪个属性,第三个参数是长度可变的float数据,用来指定动画变化过程中属性的值。下面分别对透明度、旋转、缩放、平移四种属性动画进行讲解。2.2.3知识准备2.透明度动画透明度动画主要通过指定目标对象的透明度在动画过程中的值,以及动画持续的时间来实现。代码如下:2.2.3知识准备3.旋转动画旋转动画主要通过指定目标对象的旋转角度在动画过程中的值,以及动画持续的时间来实现。代码如下:默认情况下,旋转动画的中心点在目标对象的中心位置。如果想修改中心点,可以通过imageView.setPivotX()和imageView.setPivotY()指定旋转中心点的X坐标和Y坐标。上述代码中的imageView.setPivotX(0)和imageView.setPivotY(0),表示将imageView的左上角设置旋转中心点。2.2.3知识准备4.缩放动画缩放动画主要通过指定目标对象的scaleX和scaleY两个属性在动画过程中的值,以及动画持续的时间来实现。代码如下:scale.play(scaleX).with(scaleY);表示同时执行scaleX和scaleY动画。scale.play(scaleY).after(scaleX);表示先执行scaleX,再执行scaleY。2.2.3知识准备5.平移动画平移动画主要通过指定目标对象的translationX和translationY两个属性在动画过程中的值,以及动画持续的时间来实现。2.2.4任务实施下面以图2-2-1的效果为例,介绍四种属性动画的实现过程。1.创建程序创建一个应用程序“多媒体的应用”,指定包名为com.example.chapter05.demo01。2.导入图片将一张苹果的图片apple.png导入到drawable文件夹中。3.设置布局文件采用约束布局,放置1个RadioGroup,4个RadioButton和1个ImageView。4.编写java代码由于界面上有4个单选按钮,所以使用当前类实现RadioGroup.OnCheckedChangeListener接口,并重写onCheckedChanged()方法,在该方法中,对4个单选按钮,通过ObjectAnimator.ofFloat()方法分别实现透明度、旋转、缩放和平移的动画效果。图2-2-1属性动画效果图2.2.4任务实施布局文件:采用约束布局,放置1个RadioGroup,4个RadioButton和1个ImageView。2.2.4任务实施java代码:由于界面上有4个单选按钮,所以使用当前类实现RadioGroup.OnCheckedChangeListener接口,并重写onCheckedChanged()方法,在该方法中,对4个单选按钮,通过ObjectAnimator.ofFloat()方法分别实现透明度、旋转、缩放和平移的动画效果。2.2.4任务实施java代码:由于界面上有4个单选按钮,所以使用当前类实现RadioGroup.OnCheckedChangeListener接口,并重写onCheckedChanged()方法,在该方法中,对4个单选按钮,通过ObjectAnimator.ofFloat()方法分别实现透明度、旋转、缩放和平移的动画效果。2.2.5知识拓展动画1和动画2同时执行animatorSet.play(animator1).with(animator2);动画2在动画1执行完成后执行animatorSet.play(animator1).after(animator2);动画1,2,3按顺序执行animatorSet.playSequentially(animator1,animator2,animator3);三个动画同时执行animatorSet.playTogether(animator1,animator2,animator3);1.多个动画的执行顺序问题2.2.5知识拓展插值器用来确定动画是以线性运动还是非线性运动(如加速和减速)。调用Animator的setInterpolator()方法可以设置插值器。2.插值器的使用插值器举例加速插值器:AccelerateInterpolator作用:变化的速度开始缓慢,然后加速。AccelerateInterpolatorinterpolator=newAccelerateInterpolator(10);animator.setInterpolator(interpolator);减速插值器:DecelerateInterpolator作用:变化的速度开始迅速,然后减速。DecelerateInterpolatorinterpolator=newDecelerateInterpolator(10);animator.setInterpolator(interpolator);AccelerateDecelerateInterpolator作用:变化的速度开始和结束缓慢,但中间加速。AccelerateDecelerateInterpolatorinterpolator=newAccelerateDecelerateInterpolator();animator.setInterpolator(interpolator);2.2.5知识拓展插值器用来确定动画是以线性运动还是非线性运动(如加速和减速)。调用Animator的setInterpolator()方法可以设置插值器。2.插值器的使用插值器举例预期插值器:AnticipateInterpolator作用:先向反方向加速运行,再向正方形加速运行。AnticipateInterpolatorinterpolator=newAnticipateInterpolator(3);animator.setInterpolator(interpolator);弹跳插值器:BounceInterpolator作用:变化在最后反弹。BounceInterpolatorinterpolator=newBounceInterpolator();animator.setInterpolator(interpolator);周期插值器:CycleInterpolator作用:在指定的周期数上重复动画。变化率遵循正弦曲线模式。CycleInterpolatorinterpolator=newCycleInterpolator(3);animator.setInterpolator(interpolator);线性插值器:LinearInterpolator作用:变化率不变,动画匀速运动。LinearInterpolatorinterpolator=newLinearInterpolator();animator.setInterpolator(interpolator);2.3逐帧动画的实现2.3.1任务描述2.3.2问题引导2.3.3知识准备2.3.4任务实施2.3.5知识拓展2.3.1任务描述点击“播放”按钮后,能将4幅小狗的图像按照指定的顺序进行播放,形成小狗原地起跳的动画,同时“播放”二字变成“暂停”,点击“暂停”按钮后,动画暂停播放。如图2-3-1所示。图2-3-1逐帧动画效果图2.3.2问题引导什么是逐帧动画?逐帧动画指的是逐帧绘制帧内容的动画,其实现原理是把事先准备好的若干幅静态图像按照指定的顺序进行播放,利用人眼的“视觉暂留”性质,使用户产生动画的错觉。每幅图像称为一帧。每幅图像称为一帧。图2-3-1逐帧动画效果图2.3.3知识准备1.指定图像的播放顺序在drawable文件夹下创建xml文件,在该xml文件中指定图像的播放顺序和播放时长。要求该xml文件的根节点是animation-list。每个item子节点表示一帧。代码示例如下:以上代码片段表示,先显示img1图像100毫秒,然后显示img2图像100毫秒。drawable属性用来指定图像资源。duration用来指定显示此帧的时间(以毫秒为单位)。属性名作用android:drawable用来指定drawable资源android:duration指定显示此帧的时间(以毫秒为单位)android:oneshot默认为false,当设置为true时,动画将只运行一次,然后停止。android:variablePadding默认为false,当设置为true时,则drawable的padding值随当前选择的状态而改变。android:visible用于设置drawable的可见性,默认为false。2.3.3知识准备2.AnimationDrawable类的使用该类用于创建逐帧动画的对象。通过View对象的getBackground()方法,可以获得一个AnimationDrawable对象。然后调用AnimationDrawable的start()方法即可启动动画,调用stop()方法可以在当前帧中停止动画。其他常用方法见下表。方法返回值类型方法名及作用voidaddFrame(Drawableframe,intduration)作用:将帧添加到动画中。booleanisRunning()作用:指示动画当前是否正在运行。voidsetOneShot(booleanoneShot)作用:设置动画是应该播放一次还是重复播放。参数设为true表示只播放一次。voidstart()从第一帧开始播放动画。voidstop()在当前帧中停止动画。2.3.4任务实施下面以图2-3-1的效果为例,介绍四种属性动画的实现过程。1.创建模块打开应用程序“多媒体的应用”,创建一个新的模块“frame_animation”。2.导入图片将4张小狗的图片dog1.gif、dog2.gif、dog3.gif、dog4.gif导入到drawable文件夹中。3.创建逐帧动画资源在“frame_animation”模块的res/drawable文件夹中,创建一个frame_animation.xml文件,在该文件中定义逐帧动画用到的图片及其显示时间。4.设置布局采用约束布局,放置1个ImageView用于显示动画效果,1个Button用于显示播放动画的按钮。5.编写java代码图2-3-1逐帧动画效果图2.3.4任务实施创建逐帧动画资源:在“frame_animation”模块的res/drawable文件夹中,创建一个frame_animation.xml文件,在该文件中定义逐帧动画用到的图片及其显示时间。2.3.4任务实施布局文件:采用约束布局,放置1个ImageView用于显示动画效果,1个Button用于显示播放动画的按钮。2.3.4任务实施java代码:由于界面上的播放按钮需要实现点击事件,所以使用当前类实现View.OnClickListener接口,并重写onClick()方法,在该方法中实现动画的播放与停止。具体做法是,通过isRunning()判断动画当前是否正在播放,如果没有播放,则调用start()方法播放动画,并将按钮文字改为“暂停”;否则,调用stop()方法停止播放动画,并将按钮文字改为“播放”。2.3.4任务实施java代码:当Activity销毁时,也要停止动画的播放。具体做法是,重写onDestroy()方法,在该方法中,通过isRunning()判断动画当前是否正在播放,如果是,则调用stop()方法停止播放动画,并调用clearAnimation()方法清空控件的动画。2.3.5知识拓展除了可以在XML文件中定义逐帧动画外,也可以通过java代码定义逐帧动画。通过调用AnimationDrawable类的addFrame()方法即可添加每帧的图像,并指定图像的显示时长。核心代码如下所示。2.4音频的播放2.4.1任务描述2.4.2问题引导2.4.3知识准备2.4.4任务实施2.4.5知识拓展2.4.1任务描述通过Switch开关按钮控制背景音乐的播放。当按钮处于打开状态时,能播放音乐,并显示文字“音乐播放中”,当按钮处于关闭状态时,能暂停音乐的播放,并显示文字“音乐暂停播放”,当Activity被销毁时,停止音乐的播放,并释放播放器占用的资源。图2-4-1背景音乐效果图2.4.2问题引导音频的播放是Android开发中较为常用的功能,Android是如何实现对音频播放的支持的呢?Android提供的对音频进行处理的API包是android.media,media中包括了AudioManager、MediaPlayer等类,具有设置音频类型,以及控制音频的播放、暂停、停止等功能。图2-4-1背景音乐效果图2.4.3知识准备1.MediaPlayer类的常用方法在Android中播放音频文件一般是通过MediaPlayer类实现的,该类对多种格式的音频文件提供了非常全面的控制方法,其常用方法见右表。方法返回值类型方法名及

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论