Android-skin-support

简介:Android-skin-support: 一款用心去做的 Android 换肤框架, 极低的学习成本, 极好的用户体验. 只需要两行代码, 就可以实现换肤, 你值得拥有!!!
更多:作者   提 Bug   
标签:
换肤-

skin-support-v2.1.5 design-v1.2.5 cardview-v1.2.0 v1.0.2

circleimageview-v2.2.0.2 v2.1.2 v1.4.5

介绍

Android-skin-support: 一款用心去做的 Android 换肤框架, 极低的学习成本, 极好的用户体验.

只需要一行代码, 就可以实现换肤, 你值得拥有!!!

SkinCompatManager.withoutActivity(this).loadSkin();

就这么简单, 你的 APK 已经拥有了强大的换肤功能, 当然现在是拥有了换肤功能, 别忘了制作皮肤包.

目录结构

demo // 换肤 demo 集合

skin-app // demo app

skin-night // 夜间模式皮肤工程

skin-autolayout-app // autolayout demo app

android-support // Android 原生控件

skin-support // 换肤框架, 基础控件支持

skin-support-cardview // 换肤框架, CardView 支持

skin-support-design // 换肤框架, Material Design 支持

skin-support-constraint-layout // 换肤框架, ConstraintLayout 支持

third-part-support // 第三方控件换肤支持

Demo

default app-in plug-in

用法

导入:

直接添加依赖, 最新版本选择, 请查看更新日志

compile 'skin.support:skin-support:2.1.5'          // skin-support 基础控件支持
compile 'skin.support:skin-support-design:1.2.5'   // skin-support-design material design 控件支持[可选]
compile 'skin.support:skin-support-cardview:1.2.0' // skin-support-cardview CardView 控件支持[可选]
compile 'skin.support:skin-support-constraint-layout:1.0.2' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]

使用:

在 Application 的 onCreate 中初始化

@Override
public void onCreate() {
    super.onCreate();
    SkinCompatManager.withoutActivity(this)                         // 基础控件换肤初始化
            .addStrategy(new CustomSDCardLoader())                  // 自定义加载策略,指定 SDCard 路径[可选]
            .addHookInflater(new SkinHookAutoLayoutViewInflater())  // hongyangAndroid/AndroidAutoLayout[可选]
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .addInflater(new SkinCircleImageViewInflater())         // hdodenhof/CircleImageView[可选]
            .addInflater(new SkinFlycoTabLayoutInflater())          // H07000223/FlycoTabLayout[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭 windowBackground 换肤,默认打开[可选]
            .loadSkin();
}

皮肤开关

如果项目中有特殊需求。例如, 股票控件: 控件颜色始终为红色或绿色, 不需要随着模式切换而换肤

那么可以使用类似的方法, 直接设置 drawable

setBackgroundDrawable(redDrawable) // 不支持换肤
background="#ce3d3a"

而不是使用 R.drawable.red

setBackgroundResource(R.drawable.red)
background="@drawable/red"

加载插件皮肤库

// 指定皮肤插件
SkinCompatManager.getInstance().loadSkin("new.skin"[, SkinLoaderListener], int strategy);

// 恢复应用默认皮肤
SkinCompatManager.getInstance().restoreDefaultTheme();

自定义 View 换肤

要点:

  1. 实现 SkinCompatSupportable 接口

    1. applySkin 方法中实现换肤操作
  2. 在构造方法中解析出需要换肤的 resId

  3. 自定义 View 可以直接继承自 SkinCompatView, SkinCompatLinearLayout 等已有控件

    eg: CustomTextView

  4. 不想继承自已有控件

    eg: CustomTextView2

  5. 需要换肤自定义属性

    // 需要换肤 AutoCompleteTextView 的 R.attr.popupBackground 属性

    eg: SkinCompatAutoCompleteTextView

  6. 需要使用第三方库控件怎么办

    // 需要使用https://github.com/hdodenhof/CircleImageView 控件, 并且要支持换肤

    eg: SkinCompatCircleImageView

应用内换肤:

应用内换肤,皮肤名为: night; 新增需要换肤的资源添加后缀 _night。

需要换肤的资源为 R.color.windowBackgroundColor, 添加对应资源 R.color.windowBackgroundColor_night。

加载应用内皮肤:

SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);

插件式换肤:

新建 Android application 工程

皮肤工程包名不能和宿主应用包名相同.

例如:

宿主包名: com.ximsfei.skindemo
夜间模式: com.ximsfei.skindemo.night

将需要换肤的资源放到 res 目录下(同名资源)

例如 APK 中窗口背景颜色为

colors.xml

<color name="background">#ffffff</color>

那么夜间模式你可以在 skin-night 工程中设置

colors.xml

<color name="background">#000000</color>

打包生成 apk, 即为皮肤包

将打包生成的 apk 文件, 重命名为'xxx.skin', 防止 apk 结尾的文件造成混淆.

加载皮肤插件

加载插件式皮肤, 将皮肤包放到 assets/skins 目录下

SkinCompatManager.getInstance().loadSkin("night", SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);

自定义加载策略:

以自定义 SDCard 加载路径为例:

继承自SkinSDCardLoader,通过getSkinPath方法指定皮肤加载路径,通过getType方法指定加载器 type。

public class CustomSDCardLoader extends SkinSDCardLoader {
    public static final int SKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE;

    @Override
    protected String getSkinPath(Context context, String skinName) {
        return new File(SkinFileUtils.getSkinDir(context), skinName).getAbsolutePath();
    }

    @Override
    public int getType() {
        return SKIN_LOADER_STRATEGY_SDCARD;
    }
}

注: 自定义加载器 type 值最好从整数最大值开始递减,框架的 type 值从小数开始递增,以免将来框架升级造成 type 值冲突

在 Application 中,添加自定义加载策略:

SkinCompatManager.withoutActivity(this)
        .addStrategy(new CustomSDCardLoader());          // 自定义加载策略,指定 SDCard 路径

注: 自定义加载器必须在 Application 中注册,皮肤切换后,重启应用需要根据当前策略加载皮肤

使用自定义加载器加载皮肤:

SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);

技术交流

License MIT

Android 开发经验分享
C 轮融资近 30 亿元理财推荐
Android 开发经验分享
C 轮融资近 30 亿元理财推荐