前言
本次项目实训目标打造一款智能视频剪辑APP,所提供的基本功能为:由用户选择本地视频进行上传,并且提供希望剪辑的主要人物图像,系统将智能检测出人物所在视频片段,并且合成人物cut视频,用户自行选择下载。
在本次实训中,我所负责的部分是移动端代码的编程,本周主要完成的工作是项目基本架构的搭建。
一、项目架构搭建
1.项目目录结构
项目意图打造一款 Android 端app,移动端目录结构基本如下:
- activity 目录:主要活动的集合,项目预计采用XPage框架,将以少量主要的Activity控制多个Fragment页面
- adapter 目录:适配器类集合,用于连接后端数据和前端显示
- core 目录:核心类的集合,包括一些基类以及框架的核心类
- fragment 目录:嵌入Activity的UI片段的集合
- utils 目录:工具类的集合
- widget 目录:widget小控件类的集合
- MyApp:Application类
- res 目录:存放定义应用程序菜单资源的XML文件
- AndroidManifest.xml:整个Android项目的配置文件,注册四大组件,为应用程序添加权限声明
2. 主要框架引入
项目中主要使用了X系列的框架,包括:
XUI | 一个简洁的Android原生UI框架,包括UI组件、UI主题样式、UI资源和UI辅助工具 |
XPage | 一个方便的fragment页面框架,以通用的Activity作为壳,Fragment作为页面填充展示,并且能够像Activity那样自由的切换和数据交互 |
XRouter | 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用 |
XHttp2 | 一个功能强大的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装。支持多种Http请求方式,提供大量丰富的网络请求拦截器 |
XUtil | 一个方便实用的Android工具类库。收录了Android开发过程中常用的工具类,并进行简单的分类,易于查询使用 |
XUpdate | 一个轻量级、高可用性的Android版本更新框架 |
XAOP | 一个轻量级的AOP(面向切片编程)应用框架 |
创建 x-library.gradle 文件,以引入X系列框架,并将X-Library依赖添加到 build.gradle 文件中
apply plugin: 'com.xuexiang.xaop' //引用XAOP插件
apply plugin: 'com.xuexiang.xrouter' //引用XRouter-plugin插件实现自动注册
//自动添加依赖
configurations.each {
configuration ->
def dependencies = getProject().dependencies
if (configuration.name == "implementation") {
//为Project加入X-Library依赖
//XUI框架
configuration.dependencies.add(dependencies.create(deps.xlibrary.xui))
configuration.dependencies.add(dependencies.create(deps.androidx.appcompat))
configuration.dependencies.add(dependencies.create(deps.androidx.recyclerview))
configuration.dependencies.add(dependencies.create(deps.androidx.design))
configuration.dependencies.add(dependencies.create(deps.glide))
//XUtil工具类
configuration.dependencies.add(dependencies.create(deps.xlibrary.xutil_core))
//XAOP切片
configuration.dependencies.add(dependencies.create(deps.xlibrary.xaop_runtime))
//XUpdate版本更新
configuration.dependencies.add(dependencies.create(deps.xlibrary.xupdate))
//XHttp2
configuration.dependencies.add(dependencies.create(deps.xlibrary.xhttp2))
configuration.dependencies.add(dependencies.create(deps.rxjava2))
configuration.dependencies.add(dependencies.create(deps.rxandroid))
configuration.dependencies.add(dependencies.create(deps.okhttp3))
configuration.dependencies.add(dependencies.create(deps.gson))
//XPage
configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_lib))
//页面路由
configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_runtime))
}
if (configuration.name == "annotationProcessor") {
//XPage
configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_compiler))
//页面路由
configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_compiler))
}
if (configuration.name == "debugImplementation") {
//内存泄漏监测leak
configuration.dependencies.add(dependencies.create(deps.leakcanary))
}
}
configurations.all {
resolutionStrategy.force deps.okhttp3
}
在 util 文件夹下,创建 XBasicLibInit.java 文件,来完成X系列基础库的初始化,在 MyApp.java 中调用 init 函数,使得项目运行即可初始化基础库
public final class XBasicLibInit {
private XBasicLibInit() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 初始化基础库SDK
*/
public static void init(Application application) {
//工具类
initXUtil(application);
//网络请求框架
initXHttp2(application);
//页面框架
initXPage(application);
//切片框架
initXAOP(application);
//UI框架
initXUI(application);
//路由框架
initRouter(application);
}
/**
* 初始化XUtil工具类
*/
private static void initXUtil(Application application) {
XUtil.init(application);
XUtil.debug(MyApp.isDebug());
TokenUtils.init(application);
}