当换肤的时候会通知到 Activity 并触发onThemeUpdate方法,这里调用了SkinInflaterFactory的apply方法。SkinInflaterFactory的apply方法中对缓存的属性信息遍历更新实现换肤。 2. 皮肤包的加载逻辑 皮肤包的记载逻辑,即通过自定义的AssetManager实现,类似于插件化。 publicvoidload(String skinPackagePath, final ILoaderListener...
如何定位到需要换肤的控件,并优雅地更改样式,如 无须重启换肤 等。 针对第一个问题,相关的研究已经比较多了,通过研究Resource类 的源码,在其构造函数中有个AssetManager类参数,而最终获取资源都是通过AssetManager来获取的。 于是,通过构造AssetManager并生成插件的Resource类,就可以加载插件包中的资源。 针对第二个问题...
通过实例化的AssetManager对象,生成插件包对应的Resources对象,拿到该对象即可操作插件包的相关资源文件。 privateResourcespluginRes;//插件Resource对象 privateStringpluginApkPackageName;//插件Apk的包名 publicResPluginOnAssetManagerPatterninitManager(Context curContext,String pluginApkPath)throwsIllegalAccessException,Insta...
// 创建AssetManager AssetManager assetManager = AssetManager.class.newInstance() ) { // 反射调用 创建AssetManager#addAssetPath Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class); // 获取到当前apk在手机中的路径 String...
1.AssetManager加载皮肤包资源 AssetManager里面有一个hide的方法addAssetPath,通过反射调用这个方法可以给AssetManager设置我们皮肤资源的path,来加载皮肤资源 /** * Add an additional set of assets to the asset manager. This can be * either a directory or ZIP file. Not for use by applications. Returns ...
看到这里就可以明白,如果想要加载皮肤包的资源,那就需要在 AssetManager 上做文章,本篇博客主要熟悉源码流程,思路在下一篇分享。 只需记住 Resources 中包含 ResourcesImpl,而 ResourcesImpl 中又包含着 AssetManager 即可。 最后 本篇主要分享了布局加载流程(好像跟换肤没啥关系)、View 创建过程(重点)、Resources 简单...
换肤相应的API Resources提供了可以通过@+id、Type、PackageName这三个参数就可以在AssetManager中寻找相应的PackageName中有没有Type类型并且id值都能与参数对应上的id,进行返回,然后通过这个id再调用Resource的获取资源的api就可以得到相应的资源。 这里我们需要注意的一点是getIdentifier(String name,String defType,String...
TG换肤框架的实现主要依赖于Android的AssetManager类。以下是实现换肤的关键步骤: 资源包管理:将换肤资源打包成.apk或.zip文件,通过AssetManager加载这些资源包。 资源访问:通过AssetManager访问资源包中的资源文件,如颜色、图片等。 资源替换:在运行时动态替换应用的资源,实现换肤效果。
而在AssetManager 中添加Res目录正是应用换肤功能得以实现的第一步,只有将皮肤包的Res文件路径 添加到 AssetManager的Path中,应用才有可能获取到皮肤包内资源文件。 三、Resource包装流 解决方案 这个方案的思路在于拦截应用中 对于Resource对象的操作。即拦截ContextImp中的Resource对象。
// 构造出新的皮肤包 Resources;skinRes.assets 是皮肤包的 AssetManager valnewRes = Resources(skinRes.assets, res.displayMetrics, res.configuration) // 当前按钮默认背景色 valdefaultResId = R.color.colorPrimary valresName = res.getResourceEntryName(defaultResId)// name 用于去皮肤包中寻找资源 ...