###前言

上节我们讲到了`Android-skin-support`库的应用内换肤,大家感兴趣的可以参看文章:

[Android换肤(一) — 应用内换肤](http://www.demodashi.com/demo/16680.html)

那么这节基于Android-skin-support库,我们来学习下它的另一种换肤方式——插件式换肤

今天涉及的内容:

1. androidx版本皮肤库的依赖

2. 初始化

3. 应用内换肤的使用

3.1 新建皮肤项目

3.2 将皮肤资源文件拷贝到你项目中

3.3 代码中控件设置皮肤

4. 更多

5. 效果图和项目结构图

先来波效果图

![](/contentImages/image/20200305/OSZVKyPLleOz8OpVyjl.gif)

####一. androidx版本皮肤库的依赖

在app_module的build.gradle中添加库引用:

```

//===========Android换肤=======

implementation 'skin.support:skin-support:4.0.4' // skin-support

implementation 'skin.support:skin-support-appcompat:4.0.4' // skin-support 基础控件支持

implementation 'skin.support:skin-support-design:4.0.4' // skin-support-design material design 控件支持[可选]

implementation 'skin.support:skin-support-cardview:4.0.4' // skin-support-cardview CardView 控件支持[可选]

implementation 'skin.support:skin-support-constraint-layout:4.0.4' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]

```

####二.初始化

基础配置与上篇文章一样,在你项目的自定义Application中初始化皮肤库:

```

// 框架换肤日志打印

Slog.DEBUG = true;

SkinCompatManager.withoutActivity(this)

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

// .addStrategy(new ZipSDCardLoader()) // 自定义加载策略,加载zip包中的资源

.addInflater(new SkinAppCompatViewInflater()) // 基础控件换肤初始化

.addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选]

.addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选]

.addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选]

.setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选]

.setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选]

.loadSkin();

```

####三. 应用内换肤的使用

#####3.1 新建皮肤项目

新建皮肤工程`SkinDemo`(项目名称及包名全路径不能和你现在的项目一样),将你要设置的`color`及`drawable`资源设置到`SkinDemo`项目的`app/src/main/res/`文件夹对应的资源文件下。例如,你要添加换肤功能的项目为`TestDemo`,然后下面`app/src/main/res/`下有颜色资源

```

#000000

```

以及图片资源:

```

ic_test.png

```

则你在皮肤工程项目的`app/src/main/res/`下也要写有颜色资源

```

#ff0000

```

注:此处`main_test`的色值要写你想更换的色值,我此处以红色为例。

然后也要在`app/src/main/res/`下写一个图片资源相同的名字

```

ic_test.png

```

然后图片用你要用作皮肤的图片。

这个弄完以后,将SkinDemo项目打包出一个可运行的apk(如:test_skin.apk),然后将test_skin.apk重命名为night.skin(如我想给皮肤文件命名为night).

#####3.2 将皮肤资源文件拷贝到你项目中

现在我们的皮肤文件已经为`night.skin`,然后将此文件拷贝到我的项目`TestDemo`的`assets/skins/`文件夹下,整个路径为:`assets/skins/night.skin`,如下图

![](/contentImages/image/20200305/75UuO0KY9flgwwGjKa5.png)

**这里千万注意:要拷贝到你项目的`assets/skins/`文件夹下,而不是`assets/`文件夹下,若`skins`文件夹没有则新建下。如果这里路径搞错了,会使换肤失败**

#####3.3 代码中控件设置皮肤

这里和之前讲过的一样,可参看[Android换肤(一) — 应用内换肤](https://www.jianshu.com/p/8383bd253dca)中第五点的`5.1`和`5.2`。

下面主要讲下关于皮肤开关设置的问题。

由于皮肤文件(`night.skin`)是放到`assets/skins/`文件夹下加载的,所以我们可以这样来开启和关闭皮肤特效:

```

private void changeSkin(boolean isOpen){

if(isOpen){

LogUtil.i("=======插件加载=======");

ToastUtil.shortShow("App皮肤加载");

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

}else{

ToastUtil.shortShow("App皮肤还原");

// 恢复应用默认皮肤

SkinCompatManager.getInstance().restoreDefaultTheme();

}

}

```

针对` SkinCompatManager.getInstance().loadSkin(...)`方法:

- 第一个参数为`assets/skins/night.skin`的文件`night.skin`

- 第二个参数为 皮肤设置监听,可设置可不设置,不需监听的时候,设置为`null`

- 第三个参数因为皮肤资源从`assets`加载出来的,所以第三个参数为`SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS`

####四. 更多

更多详细使用方式,可参考文章

[Android换肤(二) — 插件式换肤](https://www.jianshu.com/p/11f7a69fc9a2)

####五. 效果图和项目结构图

效果图

![](/contentImages/image/20200305/OSZVKyPLleOz8OpVyjl.gif)

项目`TestDemo`结构图

![](/contentImages/image/20200305/r7QhcYohVmtJa7G4QlG.png)

皮肤资源项目`SkinDemo`结构图

![](/contentImages/image/20200305/QWuAZxSt1Yl1nJx3o0u.png)

若有什么不理解的地方,欢迎随时@我,相互学习交流。

android换肤动画,Android换肤(二) — 插件式换肤相关推荐

  1. 换肤方案,换肤策略,App插件式换肤实现方案

    UI换皮肤或白天黑夜模式,从产品上来看,是两种不同产品设计模式:白天黑夜模式只有两种模式:而换皮肤可以有多套,可以进行商业化,并盈利. 换肤的本质就是去替换资源文件.我们知道,Android应用程序由 ...

  2. (源码阅读)插件式换肤的demo的实现

    在通过阅读Resources资源加载的流程后,知道了Android的资源加载都是通过Resources这个类来加载的,所以我们也来写一个小型的插件式换肤的demo 主要就是在Activiy里面写了,主 ...

  3. android插件式换肤核心实现

    本文思路来源于腾讯课堂,在此记录与大家分享并记录后用 在setContentView之前对view进行拦截 @Overrideprotected void onCreate(Bundle savedI ...

  4. android插件式换肤,Android学习之插件化换肤

    做好计划,定期复盘,感知责任,提高执行力换肤有好几种方式,今天主要来看看插件化换肤的相关知识,本文主要涉及到的知识点: setContentView实现源码分析.LayoutInflater中的inf ...

  5. 9.Android学习之动画与多媒体(二)

    目录 9.动画与多媒体(二) 2.播放音频与视频 2-1.使用MediaPlayer类播放音频 2-2.使用SoundPool类播放音频 2-3.使用 VideoView组件播放视频 4.难点解答 4 ...

  6. android 飘心动画(直播点赞)效果(二)---贝塞尔曲线的实现

    上篇文章 android 飘心动画(直播点赞)效果 只有代码,没有相关的说明.因为我自己也没有看懂,所以参照网上另一篇关于贝塞尔曲线实现 飘心动画的效果,目的就是 便于理解上篇文章代码的思路,然后写个 ...

  7. Android实现白天黑夜动画,android 实现【夜晚模式】的另外一种思路

    源码地址 在一切开始之前,我只想用正当的方式,跪求各位的一个star 预览 序 在写SegmentFault for Android 4.0的过程中,因为原先采用的夜间模式,代码着实不好看,于是我又开 ...

  8. android 缩放透明动画,Android之高仿QQ6.6.0侧滑效果(背景动画、透明+沉浸式状态栏、渐变效果)...

    根据需求实现类似QQ侧滑效果,之前看到过很多实现方式通过SlidingMenu,但是既然官方推出了自己的专属控件,那么使用DrawerLayout就是不二选择.且看下文. 一.先来看看官方文档解释 D ...

  9. android 属性翻牌动画,android scale实现翻牌动画效果

    简单流程: 这个翻牌其实并不是立体那种翻转,而是通过收缩和伸展来完成的. 有两张图片,一张为背面: 一张为正面: 以扑克牌本身的中心点为轴,两边像中心收缩: 当背面收缩到完全没有后,通过对动画的监听器 ...

最新文章

  1. CserialPort类的简单用法
  2. linux centos7.6.1810安装nfs命令整理
  3. Java的设计模式----strategy(策略模式)
  4. 【Go API 开发实战 1】该教程所实现的 API 功能
  5. 更换mysql_3分钟学会mysql数据库的逻辑架构原理
  6. 抖音升级老年人防沉迷提醒机制 覆盖多个使用场景
  7. 1299元起!小米CC9系列发布:全系标配双旗舰相机和屏幕指纹
  8. About 日常生活感想
  9. 认知无线电网络的简单介绍
  10. 智能实验室管理系统的现状怎么样
  11. py2exe 打包 Pmw Error 3 解决方案
  12. 智能对话机器人开发实战案例剖析(2)
  13. OpenStack部署(二)keystone
  14. AMD公司的灵魂Athlon产品回忆录
  15. 关于 allegro的pcbEditor在使用过程中经常卡或者busy无响应 的解决方法
  16. 某预约系统分析 某区公共自行车租车卡在线预约,关于如何提高成功概率
  17. 论文阅读-A cooperated shuffled frog-leaping algorithm for distributedenergy-efficient hybrid flow ...
  18. android mediaplayer播放sdcard音乐,Android 音乐播放MediaPlayer
  19. 计算机桌面移至其它盘,Windows如何迁移桌面至其它盘
  20. 信息学奥赛C++编程:奥运奖牌计数

热门文章

  1. 《Hexo: 从零开始编写自己的主题》3. 优化样式,设计自己的主题
  2. 整合策划和跨界活动的方法
  3. 站在山顶上看golang的前世今生与未来展望
  4. oVirt管理端高可用模式搭建(hosted-engine)
  5. media在HTML中作用,web前端:关于css中@media的一些基本使用
  6. 大数据之scala学习(一) 案例操作
  7. xp怎么修改桌面图标?
  8. 利用阿里云镜像加速器对docker镜像源加速
  9. Win10清理鼠标右键新建菜单
  10. 吴洪声十问戴跃: 域名圈巴菲特是如何炼成的?