android 换肤探索(一) 手把手做一个皮肤包

本文详细介绍了Android应用换肤的基本原理,通过修改AssetManager的路径来加载皮肤包资源,创建了一个简单的demo展示如何改变TextView的颜色。在皮肤包中创建不同的颜色资源,然后在主应用中通过工具类读取皮肤包的颜色并应用到UI上,实现换肤效果。文章最后指出这种方法存在的局限性,并预告将通过hook技术解决全局属性修改的问题。
摘要由CSDN通过智能技术生成

一、原理

普通的开发时,如果要给一个View设置背景颜色,通常会这样

view.setBackgroundColor(context.getResources().getColor(R.color.black));

context.getResources()返回一个Resources对象,里面有getColor(...),getString(...)等方法,可以通过这些方法返回颜色字符串等。那么,如果我们如果能从另一个地方获取Resources对象,例如一个皮肤包,然后读取里面的颜色图片等,是不是就可以换肤了呢。

二、如何获取皮肤包的资源文件

AssetManager提供了这么一个方法,通过path更改Asset路径.该方法是hide的。

    public int addAssetPath(String path) {
   
        return addAssetPathInternal(path, false /*overlay*/, false /*appAsLib*/);
    }

然后Resources的构造方法是这样的:

    public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config) {
   
        this(null);
        mResourcesImpl = new ResourcesImpl(assets, metrics, config, new DisplayAdjustments());
    }

所以,想要通过皮肤包创建一个Resources,需要这样写:

 private Resources getAsseResources(Context context, String skinApkPath) {
   
        try {
   
            Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
            AssetManager assetManager = AssetManager.class.newInstance();
            method.invoke(assetManager, skinApkPath);
            return new Resources(assetManager,
                    context.getResources
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值