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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@删库跑路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值