Android-换肤功能实现
Android换肤功能已不是肤功什么新鲜事了,市面上有很多第三方的换肤库和实现方案。 之所以选择腾讯的肤功QMUI库来演示APP的换肤功能,主要原因: 1、换肤功能的肤功实现过程较简单、容易理解; 2、肤功能轻松适配Android 10 提供的肤功Dark Mode(深色模式) ; 3、还能白嫖QMUI的肤功各种组件、效果(这才是肤功重要的,😁哈哈~);
1.1、新建工程
通过AndroidStudio新建一个空工程(新建工程的肤功过程,略),并添加QMUI依赖:
implementation ‘com.qmuiteam:qmui:2.0.0-alpha10’
1.2、定义 attr 以及其实现 style(重点)
这一步需要我们与设计师协作,整理一套颜色、肤功背景资源等供 App 使用。肤功之后我们在 xml 里以 attr 的肤功形式给它命名,本工程案例:
src/main/res/values/styles.xml:
src/main/res/values/colors.xml:
style 是支持继承的, 以上述为例,app_skin_1 继承自 AppTheme, 在通过 attr 寻找其值时,如果在 app_skin_1 没找到,那么它就会去 AppTheme 寻找。因此我们可以把 App 的肤功 theme 作为我们的一个 skin, 其它 skin 都继承自这个 skin。
1.3 自定义换肤管理类
APP的肤功不同皮肤、颜色已定义好,我们需要定义一个类,与QMUI对接,用于管理这些皮肤,代码功能包含:皮肤的肤功加载、切换等操作。肤功
src/main/java/com/qxc/testandroid/QDSkinManager.java:
1.4、自定义皮肤保存类
当我们切换皮肤后,需要将切换后的皮肤信息保存起来,当下次启动APP时,直接加载我们切换后的皮肤。
src/main/java/com/qxc/testandroid/QDPreferenceManager.java:
1.5、APP加载QDSkinManager并适配深色模式
该工作仅需做一次即可,建议:自定义Application,实现该功能。
src/main/java/com/qxc/testandroid/QDApplication.java:
别忘了在AndroidManifest.xml中指定一下我们自定义的Application类:
1.6、开始编写Activity
基本工作已准备完毕,接下来我们实现定义的换肤效果。 修改MainActivity的布局文件,编写我们的UI布局:
src/main/res/layout/activity_main.xml:
注意:要想实现换肤,我们设置控件颜色时,要使用QMUI提供的换肤属性:
QMUI官网已提供了以下换肤属性,供我们使用,能满足常规的开发需要,如下图所示:
下面,我们来编写Activity代码。 在 Activity中,我们需要对QMUISkinManager进行注册,该Activity才能享用换肤功能(注意:在实际开发中,如果APP所有的页面都要支持换肤,那么我们尽量将QMUISkinManager的注册写在BaseActivity中)。
有两种方案,实现注册:
方案1:
我们可以Activity类继承 QMUIFragmentActivity 或者 QMUIActivity ,从而默认注入了 QMUISkinManager
方案2(为了让大家明白如何注册,我们选择这种方案。不用担心,其实很简单):
我们自己实现QMUISkinManager的注册、取消注册
至此,编码结束了。
QMUI 换肤提供的 API:
- QMUISkinManager: 存储肤色配置,并且派发当前肤色给它管理的Activity、Fragment、Dialog、PopupWindow。它通过 QMUISkinManager.of(name, context) 获取,是可以多实例的。因而一个 App 可以在不同场景执行不同的换肤管理, 例如阅读产品阅读器的换肤和其它业务模块 uiMode 切换的区分管理。
- QMUISkinValueBuilder: 用于构建一个 View 实例的换肤配置(textColor、background、border、separator等)
- QMUISkinHelper: 一些辅助工具方法,最常用的为 QMUISkinHelper.setSkinValue(View, QMUISkinValueBuilder),将 QMUISkinValueBuilder 的配置应用到一个 View 实例。如果使用 kotlin 语言,可以通过 View.skin { … } 来配置 View 实例。
- QMUISkinLayoutInflaterFactory: 用于支持 xml 换肤配置项解析。
- IQMUISkinDispatchInterceptor: View 可以通过实现它,来拦截 skin 更改的派发。
- IQMUISkinHandlerView: View 可以通过实现它,来完全自定义不同 skin 的处理。
- IQMUISkinDefaultAttrProvider: View 可以通过实现它, 提供 View 默认的默认换肤配置,从组件层面提供换肤支持。
文末
您的点赞收藏就是对我最大的鼓励! 欢迎关注我的简书,分享Android干货,交流Android技术。 对文章有何见解,或者有何技术问题,欢迎在评论区一起留言讨论!
本文转自 https://juejin.cn/post/7038482977914880008,如有侵权,请联系删除。
(责任编辑:百科)