fragmject

Project Url: miaowmiaow/fragmject
Introduction: 适合初学者入门的项目,通过对 Kotlin 的系统运用,实现的一个功能完备符合主流市场标准 App。包含知识点(MVVM 开发架构、单 Activity 多 Fragment 项目设计、暗夜模式、屏幕录制、图片编辑、字节码插桩)。项目结构清晰,代码简洁优雅。
More: Author   ReportBugs   
Tags:

刚开始学习Kotlin其实挺痛苦的,相关的书籍或视频偏向于知识点的讲解看完好像还是不会做项目,开源的项目内容太多用来上手实在不合适。
多希望有一个项目,它不用多么的炫酷吊炸天,只要代码够简单,内容够全面,知识够详细,于是便有了这个入门级的项目。 在此感谢玩 Android 提供的开放 API

简介

真正的入门级的项目,通过对KotlinJetpack全家桶的系统运用,实现的一个功能完备符合主流市场标准 App。 一个代码够简单,内容够全面,知识够详细,能让你快速上手的项目,对理解其他项目设计思想和封装技巧也很有帮助。
学习本项目你将有如下收获:

  • Kotlin(函数进阶,泛型,反射,协程...)
  • MVVM(ViewModel,LiveData...)
  • 单 Activity 应用架构(Navigation)
  • 屏幕录制、图片编辑、字节码插桩...

    截图展示

    | 1.jpg | 2.jpg | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 3.jpg | 4.jpg |

    项目目录结构

    ├── 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,不再展开)
    ├── module-user                          用户模块(目录同 app,不再展开)
    ├── module-wan                           玩 Android 功能模块(目录同 app,不再展开)
    | 
    ├── plugin-statistic                     统计插件模块
    |   └── src 
    |       └── main 
    |           └── groovy                   源码目录
    |           |   ├── bp                   埋点统计目录
    |           |   └── mt                   耗时统计目录
    |           | 
    |           └── resources                配置目录
    |               └── statistic.properties 插件配置
    | 
    ├── repos                                统计插件生成目录
    |
    ├── build.gradle                         项目构建配置
    ├── config.gradle                        gradle 编译文件 gradle 依赖配置
    ├── config.properties                    项目配置
    ├── gradle.properties                    gradle 配置
    └── settings.gradle                      项目依赖配置
    

    Kotlin

    Kotlin是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。
  • 学习 Kotlin 编程语言
  • Kotlin 代码示例

    ViewBinding

    通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。与使用findViewById相比,视图绑定具有 Null 安全类型安全 等很显著的优点。
  • 轻松使用 ViewBinding

    LiveData

    LiveData是一种可观察的数据存储器类,它具有生命周期感知能力,这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。并且它具有 确保界面符合数据状态不会发生内存泄漏不会因 Activity 停止而导致崩溃不再需要手动处理生命周期数据始终保持最新状态适当的配置更改共享资源 等优势。
  • 轻松使用 LiveData

    ViewModel

    ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。
  • 轻松使用 ViewModel

    协程

    协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码。它包括 轻量内存泄漏更少内置取消支持Jetpack 集成 等特点。
  • 轻松使用协程 Navigation是 Android Jetpack 组件之一,主要是用于Fragment路由导航的框架,通过Navigation我们可以设计出单Activity应用架构。
  • 一文看懂 Navigation

    基于 RoomDatabase 封装的 KVDatabase

    通过键值对的方式来存储数据,不用再去关心RoomDatabase的复杂操作。

    快速使用

    ``` 1、存储数据 KVDatabase.set(key: String, value: String)

2、获取数据 KVDatabase.get(key: String)

## 基于 SharedFlow 封装的消息总线 SharedFlowBus
- [SharedFlowBus:30 行代码实现消息总线你确定不看吗](https://juejin.cn/post/7028067962200260615)
### 快速使用

// 发送消息 SharedFlowBus.with(objectKey: Class).tryEmit(value: T) // 发送粘性消息 SharedFlowBus.withSticky(objectKey: Class).tryEmit(value: T)

// 订阅消息 SharedFlowBus.on(objectKey: Class).observe(owner){ it -> println(it) } // 订阅粘性消息 SharedFlowBus.onSticky(objectKey: Class).observe(owner){ it -> println(it) }

## 动态权限申请
- [超详细 —— 自己动手撸一个 Android 动态权限申请库](https://juejin.cn/post/6991471901704978440)
## 字节码插桩
- [最通俗易懂的字节码插桩实战(Gradle + ASM)—— 优雅的打印方法执行时间](https://juejin.cn/post/6986848837797658637)
- [最通俗易懂的字节码插桩实战(Gradle + ASM)—— 自动埋点](https://juejin.cn/post/6985366891447451662)
## 图片编辑器
- [巨丝滑 —— 自己动手撸一个图片编辑器(支持长图)](https://juejin.cn/post/7013274417766039560)
### 截图展示
| ![5.gif](https://gitee.com/zhao.git/PictureWarehouse/raw/master/FragmentProject/VID_20210929142301.gif) | ![6.gif](https://gitee.com/zhao.git/PictureWarehouse/raw/master/FragmentProject/VID_20210929141429.gif) |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
### 接入
第 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)

如上所示:
1. 通过`PictureEditorDialog`调用图片编辑器
2. 通过`setBitmapPath(path)`传入图片路径
3. 通过`setEditorFinishCallback(callback)`获取编辑后的图片地址

**如果觉得`PictureEditorDialog`不能满足需求,还可以通过`PictureEditorView`来自定义样式**

### 自定义使用

```
picEditor.setBitmapPath(path)
picEditor.setMode(PictureEditorView.Mode.STICKER)
picEditor.setGraffitiColor(Color.parseColor("#ffffff"))
picEditor.setSticker(StickerAttrs(bitmap))
picEditor.graffitiUndo()
picEditor.mosaicUndo()
picEditor.saveBitmap()

如上所示:

  1. 通过setBitmapPath(path)传入图片路径
  2. 通过setMode(mode)设置编辑模式,分别有:涂鸦,橡皮擦,马赛克,贴纸
  3. 通过setGraffitiColor(color)设置涂鸦画笔颜色
  4. 通过setSticker(StickerAttrs(bitmap))设置贴纸
  5. 通过graffitiUndo()涂鸦撤销
  6. 通过mosaicUndo()马赛克撤销
  7. 通过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()

如上所示:

  1. 通过setBitmapResource(bitmap)传入裁剪图片
  2. 通过clip.rotate()图片旋转
  3. 通过clip.reset()图片重置
  4. 通过clip.saveBitmap()保存裁剪框内图片

PictureClipView就介绍到这里,具体使用请查看PictureClipDialog

讲在最后,如无法加载图片,请确认存储权限

主要开源框架

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ```

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools