fragmject
项目地址:miaowmiaow/fragmject
简介: 适合初学者入门的项目,通过对 Kotlin 的系统运用,实现的一个功能完备符合主流市场标准 App。包含知识点(MVVM 开发架构、单 Activity 多 Fragment 项目设计、暗夜模式、屏幕录制、图片编辑、字节码插桩)。项目结构清晰,代码简洁优雅。
标签:
刚开始学习 Kotlin
其实挺痛苦的,相关的书籍或视频偏向于知识点的讲解看完好像还是不会做项目,开源的项目内容太多用来上手实在不合适。
多希望有个代码简单,内容全面,知识详细,快速上手的项目,于是便有了 fragmject
项目。
在此感谢 玩 Android 提供的 开放 API 。
简介
一个入门级的项目,通过对 Kotlin
和 Jetpack
全家桶的系统运用,实现的一个功能完备符合主流市场标准 App。 代码简单,内容全面,知识详细,快速上手,对理解其他项目设计思想和封装技巧也很有帮助。
学习本项目你将有如下收获:
- Kotlin(函数进阶,泛型,反射,协程...)
- MVVM(ViewModel,LiveData...)
- 单 Activity 应用架构(Navigation...)
- 常用封装(图片选择器、图片编辑器、日期控件、全面屏沉浸、屏幕录制、字节码插桩...)
开发环境
为了您能正常运行本项目,请使用 Android Studio Bumblebee (2021.1.1) 🐝
和 Android Gradle 7.1.2
或者以上版本
如果您不方便升级开发工具,请切换至 tag v1.2.6.1
截图展示
| ||
---|---|---|
项目目录结构
├── app app
| └── src
| └── main
| | └── java 源码目录
| | | ├── activity Activity 目录
| | | | └── MainActivity 项目唯一 Activity
| | | ├── adapter Adapter 目录
| | | ├── fragment Fragment 目录
| | | ├── model ViewModel 目录
| | | └── App Application
| | |
| | └── res 资源目录
| | | └── navigation 导航图目录
| | |
| | └── AndroidManifest.xml 配置文件
| |
| └── build.gradle 模块构建配置
| └── channel 渠道配置文件
| └── dictionary 自定义混淆字典
| └── proguard-rules.pro 代码混淆配置文件
|
├── library-base 基础 library(存放通用封装源码)
| └── src
| └── main
| | ├── assets 原生文件目录
| | └── java 源码目录
| | ├── bus 消息总线目录
| | ├── db Database 目录
| | ├── dialog Dialog 目录
| | ├── http 网络请求目录
| | ├── provider ContentProvider 目录
| | ├── utils 工具类目录
| | └── view 自定义 view 目录
| |
| └── build.gradle 模块构建配置
|
├── library-common 公共 library(存放各个 module 公用源码及资源)
| └── src
| └── main
| | └── java 源码目录
| | ├── bean 实体类目录
| | └── constant 常量配置目录
| |
| └── build.gradle 模块构建配置
|
├── miaow-picture 图片编辑器模块(目录同 app,不再展开)
├── miaow-plugin 插件模块
| └── src
| └── main
| └── groovy 源码目录
| |
| └── resources 配置目录
| └── statistic.properties 插件配置
├── module-user 用户模块(目录同 app,不再展开)
├── module-wan 玩 Android 功能模块(目录同 app,不再展开)
|
├── repos 插件生成目录
|
├── build.gradle 项目构建配置
├── config.gradle gradle 编译文件 gradle 依赖配置
├── config.properties 项目配置
├── gradle.properties gradle 配置
└── settings.gradle 项目依赖配置
Kotlin
Kotlin
是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。
ViewBinding
通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。与使用 findViewById
相比,视图绑定具有一些很显著的优点:
- Null 安全
- 类型安全
LiveData
LiveData
是一种可观察的数据存储器类,它具有生命周期感知能力,这种感知能力可确保 LiveData
仅更新处于活跃生命周期状态的应用组件观察者。
并且使用 LiveData
具有以下优势:
- 确保界面符合数据状态
- 不会发生内存泄漏
- 不会因 Activity 停止而导致崩溃
- 不再需要手动处理生命周期
- 数据始终保持最新状态
- 适当的配置更改
- 共享资源
ViewModel
ViewModel
类旨在以注重生命周期的方式存储和管理界面相关的数据。 ViewModel
类让数据可在发生屏幕旋转等配置更改后继续留存。
协程
协程是我们在 Android 上进行异步编程的推荐解决方案。值得关注的特点包括:
- 轻量
- 内存泄漏更少
- 内置取消支持
- Jetpack 集成
MVVM
MVVM(Model-View-ViewModel) 最早由微软提出。ViewModel 指 "Model of View"——视图的模型。
Navigation
Navigation
是 Android Jetpack 组件之一,主要是用于 Fragment
路由导航的框架,通过 Navigation
我们可以设计出单 Activity
应用架构。
WebView 优化及 H5 秒开实践
满满的 WebView 优化干货,让你的 H5 实现秒开体验
KVDatabase
基于 RoomDatabase 封装,通过键值对的方式来存储数据,不用再去关心 RoomDatabase
的复杂操作。
快速使用
// 存储数据
KVDatabase.set(key: String, value: String)
// 获取数据
KVDatabase.get(key: String)
SharedFlowBus
基于 SharedFlow 封装的消息总线
SharedFlowBus:30 行代码实现消息总线你确定不看吗
快速使用
// 发送消息
SharedFlowBus.with(objectKey: Class<T>).tryEmit(value: T)
// 发送粘性消息
SharedFlowBus.withSticky(objectKey: Class<T>).tryEmit(value: T)
// 订阅消息
SharedFlowBus.on(objectKey: Class<T>).observe(owner){ it ->
println(it)
}
// 订阅粘性消息
SharedFlowBus.onSticky(objectKey: Class<T>).observe(owner){ it ->
println(it)
}
字节码插桩
动态权限申请
图片编辑器
截图展示
| ||
---|---|---|
接入
第 1 步:在工程的 build.gradle
中添加:
allprojects {
repositories {
...
mavenCentral()
}
}
第 2 步:在应用的 build.gradle
中添加:
dependencies {
implementation 'com.github.miaowmiaow.fragmject:miaow-picture:1.2.6'
}
快速使用
PictureEditorDialog.newInstance()
.setBitmapPath(path)
.setEditorFinishCallback(object : EditorFinishCallback {
override fun onFinish(path: String) {
val bitmap = BitmapFactory.decodeFile(path, BitmapFactory.Options())
}
})
.show(childFragmentManager)
如上所示:
- 通过
PictureEditorDialog
调用图片编辑器 - 通过
setBitmapPath(path)
传入图片路径 - 通过
setEditorFinishCallback(callback)
获取编辑后的图片地址
如果觉得 PictureEditorDialog
不能满足需求,还可以通过 PictureEditorView
来自定义样式
自定义使用
<com.example.miaow.picture.editor.PictureEditorView
android:id="@+id/pic_editor"
android:layout_width="match_parent"
android:layout_height="match_parent" />
picEditor.setBitmapPath(path)
picEditor.setMode(PictureEditorView.Mode.STICKER)
picEditor.setGraffitiColor(Color.parseColor("#ffffff"))
picEditor.setSticker(StickerAttrs(bitmap))
picEditor.graffitiUndo()
picEditor.mosaicUndo()
picEditor.saveBitmap()
如上所示:
- 通过
setBitmapPath(path)
传入图片路径 - 通过
setMode(mode)
设置编辑模式,分别有:涂鸦,橡皮擦,马赛克,贴纸 - 通过
setGraffitiColor(color)
设置涂鸦画笔颜色 - 通过
setSticker(StickerAttrs(bitmap))
设置贴纸 - 通过
graffitiUndo()
涂鸦撤销 - 通过
mosaicUndo()
马赛克撤销 - 通过
saveBitmap()
保存编辑图片
PictureEditorView
就介绍到这里,具体使用请查看 PictureEditorDialog
图片裁剪
<com.example.miaow.picture.editor.PictureClipView
android:id="@+id/clip"
android:layout_width="match_parent"
android:layout_height="match_parent" />
clip.setBitmapResource(bitmap)
clip.rotate()
clip.reset()
clip.saveBitmap()
如上所示:
- 通过
setBitmapResource(bitmap)
传入裁剪图片 - 通过
clip.rotate()
图片旋转 - 通过
clip.reset()
图片重置 - 通过
clip.saveBitmap()
保存裁剪框内图片
PictureClipView
就介绍到这里,具体使用请查看 PictureClipDialog
主要开源框架
Gitee 镜像
About me
- QQ : 237934622
- WeChat : zst_1116
- Email : zst_1116@icloud.com
- JueJin:miaowmiaow
Thanks
感谢所有优秀的开源项目 ^^
如果喜欢的话希望给个 Star 或 Fork ^^
谢谢~~