本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助。

<

市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式

下图是网易云音乐的换肤功能

经典黑

换肤其实就是替换资源(文字、颜色、图片等)

一、换肤模式:

1.内置换肤

在Apk包中存在多种资源(图片、颜色值)用于换肤时候切换。

自由度低,apk文件大 一般用于没有其他需求的日间/夜间模式app

2.动态换肤

通过运行时动态加载皮肤包

网易云下载的资源包

二、换肤流程

流程

2.1 采集

采集

2.2 如何采集

怎么才能拿到所有的view这才是关键!那么我们只能从setContentView()入手

那么问题来了setContentView()到底干了什么

查看源码发现setContentView()通过LayoutInflater将xml转换成View加载到window中

源码三连

inflate干了什么?

干货来了!!!!

LayoutInflate 的核心是createViewFromTag()

View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,

boolean ignoreThemeAttr) {

...............

View view;

if (mFactory2 !=null) {//核心View的创建工厂 是一个接口

view =mFactory2.onCreateView(parent, name, context, attrs);

}else if (mFactory !=null) {

view =mFactory.onCreateView(name, context, attrs);

}else {

view =null;

}

if (view ==null &&mPrivateFactory !=null) {

view =mPrivateFactory.onCreateView(parent, name, context, attrs);

}

if (view ==null) {

final Object lastContext =mConstructorArgs[0];

mConstructorArgs[0] = context;

try {

if (-1 == name.indexOf('.')) {//判断是否是自定义View

view = onCreateView(parent, name, attrs);

}else {

view = createView(name,null, attrs);

}

}finally {

mConstructorArgs[0] = lastContext;

}

}

return view;

}

通过分析上面代码可以看出Factory2如果不为空那么就调用Factory2的方法创建View

否者就使用onCreateView()方法创建View

那么如果我们给定一个Factory那么我们就可以监视所有的view

View设置资源文件的流程如图所示

当我们拿到当前View的资源名称时就会先去插件中的资源文件里找。

这就是换肤的原理

加载外部Apk资源文件

拿到资源文件相信剩下的大家就知道怎么玩了

代码已经上传给 github,欢迎大家一起讨论研究

android一键换肤功能

使用方式

初始化

使用

皮肤包就是一个只有资源文件的Apk

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐