一,初识 ConstraintLayout 之实现登录页面
ConstraintLayout
Constraint Layout 是最受欢迎的 Jetpack 库之一。
ConstraintLayout 是一个使用 “相对定位” 灵活地确定微件的位置和大小的一个布局。它的出现是为了解决开发中过于复杂的页面层级嵌套过多的问题——层级过深会增加绘制界面需要的时间,影响用户体验,以灵活的方式定位和调整小部件。
项目实战
1)创建项目
① ConstraintLayout 初识
② ConstraintLayout 实现登录页面
- UI元素准备
- Logo布局调整
- 同意协议的TextView的布局调整
- 四个三方登录按钮布局调整
- 手机登录按钮布局调整
2)沉浸式的布局
3)富文本
4)属性动画
二、Navigation 实践之实现 APP 主框架以及 Navigation 的相关介绍
Navigation
Navigaion 是 Android JetPack 框架中的一员,是一套新的 Fragment 管理框架。
可以帮助开发者很好的处理 fragment 之间的跳转,优雅的支持 fragment 之间的转场动画,支持通过 deeplink 直接定位到 fragment。通过第三方的插件支持 fragment 之间安全的参数传递,可以可视化的编辑各个组件之间的跳转关系。
项目实战
1)搭建 Bottom Navigation Activity
- 新建 5个Fragment
- 新建 Menu
- 组装 BottomNavigationView
- 创建和设置 Navigation
- 进行 Navigation 功能装配
- 知识点拾遗
2)导航界面跳转
3)Navigation 传值
- 普通传值方式
- 使用 Safe Args 传值
4)Navigation 跳转动画
- 给 Action 设置 animation
- 共享元素变换(Shared Element Transition)
5)导航文件拆分
6)Deeplink 导航
三、使用 Coroutines, Retrofit,模式实现网络数据请求
Coroutines(协程), Retrofit
Retrofit 是当前应用非常广泛的网络请求框架,而 Coroutines 则是 Kotlin 中用于执行异步任务的框架,比 RxJava 还要方便易用。
项目实战
1)kotlin - Coroutine 协程
- 启动协程
- 协程中的异步操作 --- suspend函数
- 协程中的异常处理机制
- 协程总结
2)用协程和Retrofit实现网络请求
四、使用 TabLayout,ViewPager2 ,RecyclerView实现实现歌单广场页面
TabLayout,ViewPager2 ,RecyclerView
TabLayout
Tablayout 继承自 HorizontalScrollView,用作页面切换指示器,因使用简便功能强大而广泛使用在 App 中。
ViewPager2
距离 ViewPager2 正式版的发布已经一年多了,目前 ViewPager 早已停止更新,官方鼓励使用 ViewPager2 替代。ViewPager2底层基于RecyclerView实现,因此可以获得RecyclerView带来的诸多收益:
- 抛弃传统的PagerAdapter,统一了Adapter的API。
- 通过LinearLayoutManager可以实现类似抖音的纵向滑动。
- 支持DiffUtil,可以实现局部刷新。
- 支持RTL(right-to-left),对于一些有出海需求的APP非常有用。
- 支持ItemDecorator。
RecyclerView
RecyclerView 是一个强大又灵活的 View,可以用有限的 View 来展示大量的数据。
项目实战
1)ViewPager2
- 添加ViewPager2
- ViewPager2设置Adapter
- 监听ViewPager2的滚动
2)TabLayout
3)RecyclerView
- 添加 RecyclerView
- 给 RecyclerView 添加网格布局管理器
- 创建 RecyclerView.Adapter
- 将 Adapter 赋值给 RecyclerView
4)网络数据请求和数据填充
5)优化界面
- 将图片设置成有5dp的圆角
- 几个界面的请求地址不同
五、歌单页面 MVVM 架构改造及其 ViewModel 和 LiveData 的使用介绍
ViewModel,LiveData
- ViewModel
ViewModel 一发布,便成为了 Jetpack 中的核心组件之一。
ViewModel 可以将数据层与 UI 分离,而这种架构不仅可以简化 UI 的生命周期的控制,也能让代码获得更好的可测试性。
- LiveData
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。
这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
LiveData 本身是观察者,观察组件的 Lifecycle,也是被观察者,数据变化时要通知数据的观察者。
项目实战
1)MVC和MVVM介绍
- MVC
- MVVM
2)修改歌单页面
- 遗留问题1 - DiffUtil.ItemCallback怎么使用
- 遗留问题2 - 为什么先判断LiveData的value存不存在?
六、Paging 实现加载更多和下拉刷新,错误后重新请求
Paging
Paging 专注于有大量数据请求的列表处理,让开发者无需关心数据的分页逻辑,将数据的获取逻辑完全与 ui 隔离,降低项目的耦合。
但 Paging 的唯一局限性是,它需要与 RecyclerView 结合使用,同时也要使用专有的 PagedListAdapter。这是因为,它会将数据统一封装成一个 PagedList 对象,而adapter 持有该对象,一切数据的更新与变动都是通过 PagedList 来触发。
项目实战
1)Paging的优势
2)Paging实现分页加载更多
3)Paging和SwipRefreshLayout组合实现下拉刷新
4)给RecyclerView添加加载状态的Footer
- 先定义一个是否显示Footer的变量并且添加覆写两个方法:
- 修改两个覆写方法
- 遗留问题
5)发生网络错误后重试
6)帧动画
七、vlayout 嵌套横向 RecyclerView 和 Banner 实现主页的展示,自定义 Moshi 的 JsonAdapter
VLayout
VLayout 即 VirtualLayout 是阿里开源的一个针对 RecyclerView 的库,通过自定义 LayoutManager 来提供一整套布局方案和布局间的组件复用的问题。
项目实战
1)vlayout架构分析
2)vlayout布局介绍
3)基础工作准备
4)vlayout实现轮播图
5)字段内容类型不一致
八、Room 数据库实现增删改查和事务处理
Room
Room 是 Jetpack 组件库一员,属于 ORM 库,主要是对 Sqlite 做了一层抽象,从而简化开发者对数据库操作。Room 支持编译时的语法检查,并且支持返回 LiveData。
项目实战
1)添加Room依赖
2)Room详细介绍
- Entity (实体)
- Dao (数据访问对象)
- Database (数据库)
- Repository (仓库)
3)DataBase创建时插入数据
4)Room实现歌单标签编辑界面的增删改查
九、Room 数据库 Migration
1)新建 Entity
2)新建 Dao
3)修改 Database
4)修改 HomeViewModel
5)Migration
十、ExoPlayer 进行视频播放的实现
ExoPlayer
ExoPlayer 是谷歌开源的一个应用级的音视频播放器。ExoPlayer 支持基于 HTTP 的动态自适应流 (DASH)、SmoothStreaming 和通用加密、以及可以很好的支持播放队列、播放源的无缝切换等功能。它采用易于自定义和扩展的设计。
项目实战
1)ExoPlayer 介绍
2)ExoPlayer 简单的使用方法
3)ExoPlayer 简单自定义
4)ExoPlayer 高级自定义
5)ExoPlayer 在 RecyclerView 中的复用
十一、MotionLayout 让动画如此简单
MotionLayout
MotionLayout 是 ConstrainLayout 2.0 库中被引入的一个新类,帮助安卓开发者关联手势和组件动画。
MotionLayout 就像它的名字一样,首先它是一个布局,可以放置组件。其次它还是 ConstrainLayout 的子类,内置丰富的功能。创建 MotionLayout 的目的是用于降低布局过渡动画和复杂的手势处理之间的难度。
项目实战
1)MotionLayout 基础
- 让动画跑起来
- MotionScene 介绍
- OnClick 设置
- 弧形运动 Arc Motion
- 多个 ConstraintLayout 属性同时动画
- 自定义属性
- MotionLayout 的一些开发属性
- 图片变换
2)关键帧 Keyframes
- 位置关键帧 Position Keyframes
- 属性关键帧 Attribute Keyframes
- 关键触发关键帧 KeyTrigger Keyframes
3)代码启动动画和监听动画
4)MotionLayout 案例分析
- 案例1:点赞和取消点赞
- 案例2:循环旋转和文字切换
十二、Kotlin Flow基础知识详解
Kotlin Flow
Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable 、 Flowable 等等
项目实战
1)Flow 引入的场景
2)Flow 的特性
3)Flow 的构造函数
4)Flow 中间运算函数
5)Flow 结束函数
6)Flow 的错误异常处理
7)Flow 的取消
8)StateFlow / MutableStateFlow
十三、Kotlin Flow项目实战-网络、数据库和UI的应用
1)MVVM 架构中留给 Flow 的位置
2)网络数据请求
- Retrofit API
- Repository
- ViewModel
- Fragment
3)UI相关 - 输入框中输入关键词
- EditText 的 Event 转为 Flow
- Flow 值触发网络请求和 UI 刷新
4)数据库
- DataBase Migration
- Dao
- ViewModel
- Fragment
十四、View Binding 替代 ButterKnife 和 Kotlin synthetics
View Binding
Viewbinding 用于替代 findViewById。它会为每一个 XML layout 文件生成一个binding 类。binding 类实例包含所有拥有 id 的 View 的引用。
项目实战
1)解决 findViewById 的忧伤
2)View Binding 的使用
- 启动 View Binding
- View Binding 在 Activity 中的使用
- View Binding 在 Fragment 中的使用
- View Binding 在 Adapter 中的使用
3)从 Kotlin synthetics 迁移到 View Binding
- 更新 Gradle 文件
- 更新 Activity, Fragment,和Adapter文件