洋光在线内部学员学习的APP,包括课程信息、班级信息、直播、录播、课程课件信息以及作业提交等
一. MVP+Rxjava+Hilt搭建APP
采用MVP架构讲Activity的业务逻辑可以抽离到Presenter中,让Activity只负责UI逻辑,Model负责数据相关部分,整
个代码层次分明、职责明确和耦合度低,便于复用和扩展以及测试。
使用泛型和Hilt的注解,通过依赖注入的方式完成Presenter和Model的创建,避免View和Presenter、Model的直接依赖,
降低个模块的耦合。
二. 动态测量宽高
在展示标签的时候一般采用流式布局,如果标签超过了三行会展示一个折叠的按钮。得到行数一般采用先动态计算流式
布局的高度然后除以行高的方式,所以一切的关键在于动态得到流式布局的高度。
动态获取流式布局的高度采用的是ViewTreeObserver中的onGlobalLayoutListener,也就是整个视图树的布局工作结束。
在其中会发现回调被执行了两次,希望在执行第一次的时候移除监听但移除不了,后面通过阅读源码发现
view.getViewTreeObserver第一次的时候是获取的临时对象,后面被kill了,之后需要移除监听需要重新获取。 事件分发处理s三. ViewPager2联动
界面中需要展示两个ViewPager,一个ViewPager的滑动同步带动另外一个。最原先采用的是通过监听ViewPager滑动距
离,然后让另外一个ViewPager模拟滑动,采用fakeDragBy的方案,但是在实际开发中发现联动出现不一致。
第一次升级处理是通过查阅原理发现ViewPager2中使用的核心是RecyclerView,模拟滑动最终驱动的也是ReyclerView。
但ViewPager2做了相关的距离判断,导致部分情况滑动不了,所以选择直接把距离作用到RecyclerView上。
第二次升级处理是为了优化代码,官方是不断更新的,需要更加底层更适用的方式。这次运用事件分发原理,将一个
ViewPager接收到的输入事件原封不到复制分发到另外一个ViewPager,这样就会非常简单的产生同样的滑动效果。此方法非
常的简单、出错少且适应各个版本,即使以后官方代码升级都没关系。
四. 插件化换肤
通过自定义Factory2的方式,自己实现实例化View的代码并记录相关需要更换皮肤的信息,然后通过在Application中
调用registerActivityLifecycleCallback的方式给每个Activity设置好LayoutInflater的Factory2的信息,完成Hook操作。
接着构建皮肤包的Resources对象并进行resid的转换,最后记录控件的相关属性动态的更换相关的资源。此方法易引入、易
操作、无重启、无卡顿,比较适用的皮肤包技术。