Android 主题换肤的开源库

Android 主题换肤的开源库(插件化换肤)

新增夜间模式的简洁实现方式,不需要再去单独创建一个皮肤包(目前处于beta版本)

夜间模式实现方式

  1. 前提条件还是每个使用到的资源必须是引用的,不能是具体的值
  2. 开启全局换肤配置 SkinConfig.enableGlobalSkinApply()
  3. 复制一份 color.xml 文件并重命名为 color_night.xml ,然后修改 color_night.xml,在每一个 color 的 name 后面加上一个 _night后缀
  4. 对于 drawable 文件的处理也差不多,复制需要夜间模式切换的 drawable 文件,然后在其文件名上加上一个 _night 后缀,xml 文件中的颜色值修改成夜间模式需要的即可
  5. 最后在适当的地方调用 SkinManager.getInstance().NightMode() 即可实现夜间模式
  6. 具体实现可以参考示例项目

效果图如下:

Demo

1. 集成步骤:

  1. 添加依赖 compile 'com.solid.skin:skinlibrary:latestVersion' 

  2. 让你的 Application 继承于 SkinBaseApplication

  3. 让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment

  4. 在需要换肤的根布局上添加 xmlns:skin="http://schemas.android.com/android/skin,然后在需要换肤的View上加上 skin:enable="true" 

  5. 新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。

  6. 拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)

  7. 调用换肤

  • 在 assets/skin 文件夹中的皮肤

      SkinManager.getInstance().loadSkin("Your skin file name in assets(eg:theme.skin)",
                                    new ILoaderListener() {
                                        @Override
                                        public void onStart() {
                                            Toast.makeText(getApplicationContext(), "正在切换中", Toast.LENGTH_SHORT).show();
                                        }
    
                                        @Override
                                        public void onSuccess() {
                                            Toast.makeText(getApplicationContext(), "切换成功", Toast.LENGTH_SHORT).show();
                                        }
    
                                        @Override
                                        public void onFailed() {
                                            Toast.makeText(getApplicationContext(), "切换失败", Toast.LENGTH_SHORT).show();
                                        }
                                    }
    
                            );
  • 皮肤来源于网络

    SkinManager.getInstance().loadSkinFromUrl(skinUrl, new ILoaderListener() {
                        @Override
                        public void onStart() {
                            Log.i("ILoaderListener", "正在切换中");
                            dialog.setContent("正在从网络下载皮肤文件");
                            dialog.show();
                        }
    
                        @Override
                        public void onSuccess() {
                            Log.i("ILoaderListener", "切换成功");
                            dialog.dismiss();
                        }
    
                        @Override
                        public void onFailed(String errMsg) {
                            Log.i("ILoaderListener", "切换失败:" + errMsg);
                            dialog.setContent("换肤失败:" + errMsg);
                        }
    
                        @Override
                        public void onProgress(int progress) {
                            Log.i("ILoaderListener", "皮肤文件下载中:" + progress);
                            dialog.setProgress(progress);
                        }
                    });

详细的使用,请到示例项目中查看

2.换肤属性的扩展

本开源库默认支持 textColor 和 background 的换肤。如果你还需要对其他属性进行换肤,那么就需要去自定义了。

那么如何自定义呢?看下面这个例子:

TabLayout大家应该都用过吧。它下面会有一个指示器,当我们换肤的时候也希望这个指示器的颜色也跟着更改。

  • 新建一个 TabLayoutIndicatorAttr 继承于 SkinAttr,然后重写 apply 方法。apply 方法在换肤的时候就会被调用

  • 代码的详细实现

public class TabLayoutIndicatorAttr extends SkinAttr {
    @Override
    public void apply(View view) {
        if (view instanceof TabLayout) {
            TabLayout tl = (TabLayout) view;
            if (RES_TYPE_NAME_COLOR.equals(attrValueTypeName)) {
                int color = SkinResourcesUtils.getColor(attrValueRefId);
                tl.setSelectedTabIndicatorColor(color);
            }
        }
    }
}

注:attrValueRefId:就是资源 id。SkinResourcesUtils 是用来获取皮肤包里的资源,这里设置color或者drawable一定要使用本工具类。

  • 当上面的工作完成之后,就到我们自己的 Application 的 onCreate 方法中加入SkinConfig.addSupportAttr("tabLayoutIndicator", new TabLayoutIndicatorAttr());

  • 最后我们就可以正常使用了,dynamicAddSkinEnableView(tablayout, "tabLayoutIndicator", R.color.colorPrimaryDark);

3. 关于字体切换

还是遵守本项目的约定大于配置的原则,所有的字体都放到 assets/fonts 文件夹下

如何切换字体:  SkinManager.getInstance().loadFont("xx.ttf")

关于切换字体需要配置的东西: 如果只是单纯的想要字体切换这个功能。只需集成步骤中的前三步就行了。

注:字体切换功能默认不开启,需要字体切换功能请在你的Application中加入SkinConfig.setCanChangeFont(true);

4. 其他一些重要的api

  1. SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤

  2. SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤

  3. dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView


5. 使用注意事项:

  1. 换肤默认只支持 android 的常用控件,对于支持库的控件和自定义控件的换肤需要动态添加(例如: dynamicAddSkinEnableView(toolbar, "background", R.color.colorPrimaryDark);),在布局文件中使用skin:enable="true"是无效的。

  2. 默认不支持状态栏颜色的更改,如果需要换肤的同时也要更改状态栏颜色,请到您的Application文件中加入SkinConfig.setCanChangeStatusColor(true);,状态栏的颜色值来源于colorPrimaryDark

  3. 本开源库使用的 Activity 是 AppCompatActivity,使用的 Fragment 是 android.support.v4.app.Fragment

  4. 有换肤需求 View 所使用的资源一定要是引用值,例如:@color/red,而不是 #ff0000

6.项目依赖:

  1. 'com.android.support:appcompat-v7:25.3.1'
  2. 'com.mani:ThinDownloadManager:1.2.5'

7.更新日志:

  • v2.0.0 beta:无需使用皮肤包即可实现夜间模式
  • v1.4.5:fix issues 38
  • v1.4.4:修复 @null 带来的bug
  • v1.4.3:由于在开启全局皮肤切换后,过度动画会带来一些问题,在这个版本中删除了过度动画
  • v1.4.2:增加对全局应用皮肤方法,若开启则不需要在布局文件中添加 skin:enable="true"
  • v1.4.1:增加从指定目录获取drawable的方法
  • v1.4.0:
    • 修复issues9内存泄漏问题
    • 支持 style
    • 解决字体切换内存泄漏问题
    • 支持 mipmap
    • 状态栏颜色切换只支持 5.0 以上版本
    • 增加 debug 开关,方便开发调试
  • v1.3.1:优化换字体部分代码
  • v1.3.0:增加一键切换字体
  • v1.2.1:完善之前版本 View 的创建
  • v1.2.0:增加对换肤属性自定义扩展
  • v1.1.0:可以直接加载网络上的皮肤文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值