android换肤总结

1.通过设置不同的style ##

这种方式是通过设置theme 然后activity reCreate重新调用activity 设置主题必须在oncreate()方法 并且在setContentveiw()方法之前 才有效

这篇文章就是利用这种方式切换主题

缺点是:需要重启activity

换肤技术总结

换肤总结2

最终方案按照这个实现的android-skin-load 动态加载skin包

//https://github.com/burgessjp/ThemeSkinning/  在android-skin-load的基础上封装的

2.Android-Skin-Loader

http://mp.weixin.qq.com/s/MSLsoMGHyxiZ0q7fxR3zvg

加载皮肤包

其内部通过反射调用AssetManager.addAssetPath()把外部的皮肤资源加载到AssetManager中,并通过该AssetManager创建相应的Resource。当执行换肤操作的时候,就可以设置需要换肤View的相关属性为Resource中相应的资源

代码中的细节

1.每个skinAttr记录的是某个需要换肤的view的 id background 以及对应的 color / colortitlebar_bg skinAttr -----某个换肤view 的单个属性的一系列字段

2.然后将每个skinAttr 添加到 ListviewAttrs-----添加某个view换肤时所要更改的属性(可以是多个属性)

3.SkinItem (View view; Listattrs; ) 用于封装单个view和其需要换肤的对应的属性集合

4.ListmSkinItems 将所有skinitem进行存储 换肤时遍历刷新

关键的两个判断

boolean isSkinEnable = attrs.getAttributeBooleanValue(SkinConfig.NAMESPACE, SkinConfig .ATTRSKINENABLE, false); 先做 skin:enable="true" view里是否有这个属性的判断

if (!AttrFactory.isSupportedAttr(attrName)) 这个判断是看自己是否支持这个属性 里面一般不全 需要自己添加

更换皮肤

主要根据ListmSkinItems 遍历刷新 每个skinitem 用自己的id从skinmanager获取资源中的color background

skinmanager //里面的资源的获取需要自己实现

public int getColor(int resId)

getDrawable(int resId)


android换肤总结_第1张图片


android换肤总结_第2张图片

源码分析 setcontentview(R.layout.xx)的过程


android换肤总结_第3张图片


android换肤总结_第4张图片


android换肤总结_第5张图片


android换肤总结_第6张图片


android换肤总结_第7张图片


android换肤总结_第8张图片


android换肤总结_第9张图片

你可能感兴趣的:(android换肤总结)