换肤方案,换肤策略,App插件式换肤实现方案

  UI换皮肤或白天黑夜模式,从产品上来看,是两种不同产品设计模式:白天黑夜模式只有两种模式;而换皮肤可以有多套,可以进行商业化,并盈利。

  换肤的本质就是去替换资源文件。我们知道,Android应用程序由代码和资源组成。所以皮肤其实就是一个仅包含资源的apk文件。换肤三部曲:下载皮肤文件 ->获取资源 ->替换.Android程序的资源分为两大类,assert和resource,分别对应api中的AssertManager和Resource类,而AssertManager又在ResourcesImpl中,ResourcesImpl是Resource的一个具体实现类。
  Android换肤在使用场景上可以区分为静态换肤/动态换肤、应用内换肤/插件式换肤。不同的换肤方案,适用于不同的业务场景。

  回调自定义View中的方法,在此方法中改变画笔的颜色,然后 invalidate();重绘一次。  
  在Android系统中,资源主要指图片和MP3类型的文件,也是用户UI包含的所有元素。谷歌在设计Android系统时,将UI界面和逻辑代码分开组 建:界面设计通过XML的形式描述,具体的程序和应用逻辑则通过代码来实现;前端工程师只负责HTML和CSS的设计与架构,后端工程师则专门考虑JSP 和Java的代码执行.
  每个进程都有一份关于Framework的共享类和共享资源,但物理内存空间中的系统级别资源只有一份。Framework类和资源是只读的,而Android操作系统设计之初并没有硬盘的虚拟内存和换进换出机制,所以节省内存空间是非常重要的工作。
   换肤,可以认为是动态替换资源(文字、颜色、字体大小、图片、布局文件……)。UI和代码分离的原则(android开发中UI以xml文件的方式布局)。通常,皮肤资源会在主程序apk之外提供,以减少主程序的大小,以及方便随时提供新的皮肤扩展。
  国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能.

Android 换肤之旅,主题切换- https://blog.csdn.net/weixin_38261570/article/details/82079540
Android 换肤之旅,主题切换- https://github.com/ouchangxin/DynamicSkinDemo
Android换肤方案总结- https://www.jianshu.com/p/b0253de8ac04
换肤框架- https://github.com/hongyangAndroid/AndroidChangeSkin
换肤框架- https://github.com/hongyangAndroid/ChangeSkin

App插件式换肤实现方案- https://www.cnblogs.com/lzh-Linux/p/7919462.html
  App换肤主要涉及的有页面中文字的颜色、控件的背景颜色、一些图片资源和主题颜色等资源。为了实现换肤资源不与原项目混淆,尽量降低风险,可以将这些资源封装在一个独立的Apk资源文件中。在App运行时,主程序动态的从Apk皮肤包中读取相应的资源,无需Acitvity重启即可实现皮肤的实时更换,皮肤包与原安装包相分离,从而实现插件式换肤。

  QQ的皮肤是一个无界面APK应用,这个皮肤应用中的资源和主程序的资源命名一致,通过主程序和皮肤程序共享进程实现主程序对皮肤程序中资源的访问,在程序运行时通过代码显示指定皮肤资源,缺点是在主程序中每个activity要增加复杂的使用哪种皮肤逻辑,优点是效率比较快,且使应用程序具有了良好的扩展性,降低了程序的耦合性. 包括其他类似的扩展功能,都可以利用此方式实现.
  简书app的换肤策略是:通过在需要设置颜色或者背景图片的View上将颜色或者背景图片引用设置为一个自定义属性,然后android系统根据会根据当前的主题,在styles.xml文件里的获取对应主题样式下的属性值。
-- 目前比较流行的几种换肤方案是基于开源框架Android-skin-support、Android-Skin-Loader、修改样式换肤还有鸿洋的换肤方案。本文介绍的是基于Android-skin-support的换肤方案https://github.com/ximsfei/Android-skin-support 。

-- An Skin-Changing framework on Android,SkinFramework- https://github.com/Irwin-Yang/SkinFramework
 SkinFramework框架支持两种换肤方式:
1.静态换肤(推荐)
  换肤完成后,关闭掉所有的Activity,然后重新启动主界面。简单方便。
2.动态换肤
  需要换肤的Activity、Fragment、Dialog实现ISkinObserver, 并通过register(ISkinObserver observer)注册到SkinManager,动态更换布局,详情见Sample代码。
  这种方式需要重新渲染View,绑定数据,在使用Fragment时,还需要在换肤期间detach/attach fragment,使用起来比较麻烦。优点是换肤后可以停留在原来界面。
  两种方式都需要使用SkinManager提供的Resource来获取布局或其他资源。推荐写自己的BaseActivity,重写getResources()返回SkinManager提供的Resources方便使用。

(推荐)android网易云音乐动态换肤的实现- https://www.jianshu.com/p/eb93f385f5ad
一个通过动态加载本地皮肤包进行换肤的皮肤框架- https://github.com/fengjundev/Android-Skin-Loader

-- AssetManager的addAssetPath负责将另一个apk的资源文件加载进当前应用,这里由于是api隐藏方法,采用反射方式调用。https://github.com/xiaoxuan948/AndroidUnityLab/tree/master/unity_base_dev_helper/src/main/java/com/coca/unity_base_dev_helper/plugin
  SkinEngine的大致实现原理:通过反射获取Resources类的sPreloadedDrawables成员变量,使其指向自定义实现的DrawablePreloadIntercepter对象,在DrawablePreloadIntercepter中重写get()方法,当系统调用get()方法获取图片时即获取到换肤后的图片,从而实现换肤。

> 手把手讲解 Android hook技术实现一键换肤- https://www.jianshu.com/p/4c8d46f58c4f
Android hook 换肤 - https://github.com/18598925736/HookSkinDemoFromHank
  我是用hook实现一键换肤。那么什么是hook?
hook,钩子. 安卓中的hook技术,其实是一个抽象概念:对系统源码的代码逻辑进行"劫持",插入自己的逻辑,然后放行。注意:hook可能频繁使用java反射机制···
 关键点1:hook(劫持)系统创建view的过程
        if (ifAllowChangeSkin) {
            mSkinFactory = new SkinFactory();
            mSkinFactory.setDelegate(getDelegate());
            LayoutInflater layoutInflater = LayoutInflater.from(this);
            layoutInflater.setFactory2(mSkinFactory);//劫持系统源码逻辑
        }
public class SkinFactory implements LayoutInflater.Factory2 {}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值