用 Jetpack Compose 写的笔记+画板应用,顺便练手多模块架构。
主要是想试试 Compose 的 Canvas API 能不能做点有意思的东西,然后发现还挺好玩的,就顺手加了个笔记功能。
项目用了 MVI 架构,不是为了炫技,是真的觉得状态管理这么搞比较清晰。
- Kotlin 1.9.22
- Jetpack Compose (Material 3)
- Room 数据库
- Hilt 做依赖注入
- Coroutines + Flow
多模块分了几层:
core/放通用的东西(主题、工具类、数据库)feature/每个功能一个模块app/主模块负责把它们串起来
每个 feature 都是 MVI 模式,State/Intent/Effect 这套。
就是普通的笔记 app 该有的:列表、编辑、删除,都存在本地。
可以随便画,支持:
- 8 种颜色
- 笔刷粗细调节
- 清空重画
实现上用的 Compose 的 Canvas + 手势识别,性能还行。
ComposeCraft/
├── app/
│ ├── di/ # Hilt 模块
│ ├── navigation/ # 导航配置
│ └── ui/ # 主页
├── core/
│ ├── design-system/ # 主题和自定义组件
│ ├── common/ # MVI 基类、扩展函数
│ └── database/ # Room 数据库
└── feature/
├── editor/ # 笔记
└── canvas/ # 画板
git clone xxx
cd ComposeCraft
./gradlew assembleDebug或者直接用 Android Studio 打开,Run 就行。
需要:
- Android Studio Hedgehog 以上
- JDK 17
- API 26+ 的设备/模拟器
参考了 Google 的 Now in Android 项目,但做了些简化。每个 feature 的结构:
Contract.kt定义 State/Intent/EffectViewModel.kt处理业务逻辑Screen.ktUI 层
其实对这种小项目来说有点过度设计了,但就是想试试多模块编译的速度优势。实际用下来,改个 feature 模块确实比整个项目重新编译快不少。
最开始用 detectTapGestures 发现画不出连续的线,后来换成 detectDragGestures 才搞定。还有就是 Path 对象要注意复用问题,不然会有奇怪的 bug。
有时间的话可能会加:
- Markdown 支持
- 导出图片
- 云同步(可能用 Firebase)
- 暗色主题
不过也可能咕咕咕...
MIT,随便用。
有问题欢迎提 issue,PR 也欢迎。

