# skinDemo **Repository Path**: code_tjf/skin-demo ## Basic Information - **Project Name**: skinDemo - **Description**: 根据Android-skin-support换肤框架 编写的一个测试demo 及进行了简单的封装使用 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-11-12 - **Last Updated**: 2022-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # skinDemo #### 介绍 换肤框架的测试及编写的一个demo ``` 练习于 该换肤框架 Android-skin-support 主要研究的是应用内换肤 和自定义View 下如何实现换肤 ``` #### 软件架构 ``` app demo 的测试主app theme_skins 插件式换肤生成的皮肤包 skin-support-design 倚赖换肤基本库及其他 第三方库 skin_widget 测试的几个自定义View 进行的换肤 ``` #### 1. SkinApiManager的基本使用说明 1. 换肤的初始化 ``` 这个一般放在Application 中进行初始化 SkinApiManager.init(this); 继承AppCompatActivity 的需要 在activity里 重写其委托方法 如有baseActivity 可放在base 里 @NonNull @Override public AppCompatDelegate getDelegate() { return SkinApiManager.getDelegate(this, this); } ``` 2. 获得当前的皮肤包名称 ``` SkinApiManager.getSkinName(); ``` 3. 默认的主题 ``` SkinApiManager.defultTheme(); ``` 4. 多套res_x 换肤方式 加载皮肤包 应用内换肤 ``` 应用内换肤 各个换肤xml和drawable color 等多套res_x下记得前后缀的方式命名默认的资源文件名,防止无法编译冲突。 /** * 多套res下的加载皮肤包 * * @param skinName 皮肤包名称 * @param listener 回调 * @param strategy 换肤的方式 */ SkinApiManager.loadSkinFrom(String skinName, SkinLoaderListener listener, int strategy); ``` 5. Assets下的皮肤加载 ``` /** * Assets下的皮肤加载 在 res 同级下新建assets/skins/ 路径 * * @param skinName 皮肤包名称 * @param listener 回调 */ SkinApiManager.loadSkinFromAssets(String skinName, SkinLoaderListener listener) ``` 6. 自定义的SD卡下的皮肤加载 ``` /** * 自定义的SD卡下的皮肤加载 记得 给予 读写权限 路径是 /storage/emulated/0/skins/skin_night.skin *

* * *

* * @param skinName 皮肤包名称 * @param listener 回调 */ SkinApiManager.loadSkinFromSdCard(String skinName, SkinLoaderListener listener) ``` 7. 皮肤加载的回调方法 ``` SkinLoaderListener{ /** * 开始加载. */ void onStart(); /** * 加载成功. */ void onSuccess(); /** * 加载失败. * * @param errMsg 错误信息. */ void onFailed(String errMsg); } ``` #### 2. 皮肤框架自定义View 的注意事项 ``` 1 实现SkinCompatSupportable接口 2 applySkin方法中实现换肤操作 3 在构造方法中解析出需要换肤的resId 4 自定义View可以直接继承自SkinCompatView, SkinCompatLinearLayout等已有控件 5 获取自定义属性时用 typedArray.getResourceId(resId,0); 6 如果自定义的时ViewGroup 则需要实现 SkinLayoutInflater 并在初始化的方法中添加该 .addInflater(new SkinXXXViewInflater());如果单纯时View则无需实现 小提示 换肤的要放在applySkin方法中实现换肤 //图片的方式修改 public void appSkinBitmap() { focusBitId = SkinCompatHelper.checkResourceId(focusBitId); if (focusBitId != INVALID_ID) { Drawable drawable = SkinCompatResources.getDrawable(getContext(), focusBitId); mFocusBit = ((BitmapDrawable) drawable).getBitmap(); } } //颜色的方式修改 public void appSkinColor() { colorId = SkinCompatHelper.checkResourceId(colorId); if (colorId != INVALID_ID) { int colors = SkinCompatResources.getColor(getContext(), colorId); } } ``` #### 3. 以上都是根据大神的框架 进行的研究和总结的使用 如有其它问题请望告知在下