原理分析 核心代码位置 https://github.com/52inc/Scoops/tree/master/scoops/src/main/java/com/ftinc/scoop 可以看到主要文件
Flavor.java 存储每个主题信息 Scoop.java 主文件,主要提供接口,作为对外调用。 SugarCone.java 解析注释的主文件,通过使用bind方法,去反射找到编译出来的Toppings类,通过这个来关联上来。 Topping.java 自定义注释方法。标记在属性上面,然后通过编译时候,使用插件scoops-compiler,生成后缀为Toppings的绑定类,随后我们使用bind函数,将这些类和界面关联起来。
关键方法
Scoop.apply函数
我们来看下public void apply(Activity activity)的具体代码流程 找到当前的主题getCurrentFlavor
判断主题是否是白天夜间模式,如果是,设置模式 然后使用
另一个apply方法,参数是activity和主题id 设置主题,找到设置的背景色,设置窗体背景,然后返回去,我们自己recreate 重新启动当前界面,实现切换。
编译插件
https://github.com/52inc/Scoops/tree/master/scoops-compiler 主要目的是解析我们自定义的注解。解析的主要是我们在初始化时候使用addToppings加入的我们的注解。 找到后,解析出来注解的标记值,切换过场特效,和适配器。 标记值的目的是更新值的时候,用这个来做区分。
代码逻辑:找到所有的绑定在这个标记的view,然后逐个调用对应的适配器,进行对应的颜色更新。 我们来看下核心的bind函数
我们看下bind 代码,主要看下getViewBinder这个方法即可。继续去看 findViewBinderForClass 函数
代码主要流程为: 从缓存能找到,直接返回。 找不到,然后查找Class.forName(clsName + "_ToppingBinder")类,构造一个,然后将这个返回,并缓存下来。然后调用里面的bind进行关联view 我们反编译可以看到MainActivity_ToppingBinder.smali这个smali文件,这个就是插件生成出来的代码。 我们反编译下,看下这个文件做了什么。
看到了吧,将注释的全部归类进来,为后面更新的时候查找使用。 注释的就是如此了。