Android插件换肤之入门实战

学习自

https://www.jianshu.com/p/5eac94143bd6


首先是TypedArray进行一个定义,所以我们才能以src=...的形式去声明图片。所以我们需要关注TypedArray.getDrawable方法。其实他的本质还是像我们平时一样,通过Resource去获取drawable。


通过Resource去获取drawable的流程大致如下

先去找ResourceImpl的cache,没有的话就创建一个,它的创建依赖于AssetManager

而AssetManager的创建是和apk的路径进行一个绑定的


解决方案出来了:自己创建一个Resource对象,代码清晰明了

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            Resources superRes = getResources();
            AssetManager assetManager = AssetManager.class.newInstance();
            Method addAssetPathMethod = AssetManager.class.getDeclaredMethod("addAssetPath",String.class);
            String skinPath = Environment.getExternalStorageDirectory().getAbsoluteFile()+ File.separator+"plugin.zip";            addAssetPathMethod.invoke(assetManager, skinPath);

            Resources skinResources = new Resources(assetManager,superRes.getDisplayMetrics(),superRes.getConfiguration());
            int bgId = skinResources.getIdentifier("main_bg","drawable","com.hc.skin");
            Drawable bgDrawable = skinResources.getDrawable(bgId);

            findViewById(R.id.activity_main).setBackgroundDrawable(bgDrawable);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


成功



所以实现插件换肤框架可以通过:

内置一套资源。

如果处于另外的皮肤状态,实现LayoutInflterFactory进行view的创建拦截,这是对于未在内存中的view进行一个换肤。

对于已在内存中的view换肤就注册到一个单例中,作为一个记录,在换肤的时候,进行一个皮肤的更换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值