动态换肤库:BiuSkin1PNA

2023年8月25日 pm4:18发布1年前 (2023)更新 城堡大人
247 0 0

前言

上一版写过《动态换肤库:BiuSkin1PA》,出现比较严重的缺点,就是Dialog,Toast和悬浮窗View无法采集创建的View,因此也无法换肤(若在Activity中使用的话,可参考《Android换肤之Toast和Dialog》)。

因此,为了解决上面缺点,在BiuSkin1PA 基础上进行调整,搞出了一个新的动态换肤库,重新命名为:BiuSkin1PNA。

动态换肤的优点:

  • 满足用户个性化界面,比如提供多套皮肤

  • 相比于静态换肤,减少了apk大小

  • 皮肤资源独立,便于维护

Demo介绍,可看《换肤库BinSkin1的使用

正文

总所周知,动态换肤的步骤主要如下:

  1. 采集View的相关属性

  2. 加载皮肤包

  3. 刷新皮肤资源

什么是BiuSkin1PNA

  1. 1表示换肤方式一

  2. P通过Path路径加载皮肤资源

  3. NA是NoActivity缩写,不继承Activity

下载

隐藏内容!
评论可看后才能查看!

接口

跟BiuSkin1PA 的使用差不多,也更简单。

后面会有专门一篇介绍使用,这里也就大致介绍一下。

主要类或接口
SkinManager.java
ISkinRefreshListener.java
ISkinRefreshListener.java
public interface ISkinRefreshListener {
    boolean onSkinRefresh(View view, String attrName, String attrValue, String attrType, int resourceId);
}

返回View和View的属性,让用户自己判断是否需要拦截并实现换肤。

SkinManager.java

核心类,显示主要接口

public void addSupportName(String[] attributeList);
public void addIgnoreView(String[] ignoreList);
public void changeSkin(final String path);
public void setISkinRefreshListener(ISkinRefreshListener listener);
public Drawable getDrawable(...);
public int getColor(...);
public ColorStateList getColorStateList(...); 
public float getDimension(...) 
...

具体请看BiuSkin1PNA.jar

必选接口

不可缺少,缺一不可

初始化
// 初始化
SkinManager.initContext(this);
加载资源
//换肤切换,传入资源包路径[必须]
SkinManager.getInstance().changeSkin(path);
可选接口

不一定要,可根据需求进行配置。

换肤View监听
# 设置监听,可以拦截View
SkinManager.getInstance().setISkinRefreshListener(this);

@Override
public boolean onSkinRefresh(View view, String attrName, String attrValue, String attrType, int resourceId) {
    //返回View和相关属性资源
    //这里可以做拦截,返回true表示拦截
    return false;
}
添加忽略View

参考如下规则

SkinManager.getInstance().addIgnoreView(new String[]{"androidx.125la.Toolbar"});
添加自定义属性

支持添加自定义属性换肤

SkinManager.getInstance().addSupportName(new String[]{"barSize"});

参考文章

部分参考网上文章,时间太久,链接丢了,抱歉!

  1. 换肤库BinSkin1的使用

赏一杯可乐

如果觉得OK,欢迎打赏一杯可乐哈,谢谢

有bug,欢迎留言

版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

[摘]Java去除字符串中的空格

前言这篇文件是关去除空格符的,之前也想整理一下,但迟迟没有,因此今天有空摘抄于此。下面只是用了Java提供的两种方式,一种只是去除文末或开头的trim(),另外一种是用replaceAll()正则表达式匹配。本文摘抄,具体原文链接在文末。正文String.trim()String.tr...

adb 重启Android framework

前言Android调试时,有序需要修改系统的属性。使用adb shell setprop xxxx 后,重启机器后就恢复了。然后实际中,有些属性如果没重启,会遇到属性值在代码中不生效,重启后,属性值又还原的问题。比如SurfaceView的一个日志打印DEBUG开关,通过adb改变debug...

C语言之scanf()

前言简单记录一下scanf的使用。scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数。正文scanf说明语法:#include <stdio.h> int scanf( const char *format, ... ...

梁文道:专心吃饭

我曾经在别处介绍过一个我最喜欢的书痴故事,关于匈牙利革命时期的一位贵族,他嗜书如狂到了一个程度,即使是在被推上断头台之际,仍然不忘用笔在书上划线做笔记。假如一个人爱书爱到了连死之将至也不为所动的地步,那书痴这个称号他就实在是当之无愧了。我再和大家介绍一位真正的美食家。他是一位二十世纪的日本大禅师,...

龙应台:我为什么要求你读书

那天我问你,“你将来想做什么”,我注意到,你很不屑于回答我这个问题,所以跟我胡诌一通。是因为你们这个时代的人,对未来太自信,所以不屑与像我这一代人年轻时一样,讲究勤勤恳恳、如履薄冰,还是其实你们对于未来太没信心,所以假装出一种嘲讽和狂妄的姿态,来闪避我的追问?我几乎要相信,你是在假装潇洒了。今天的...

Android Socket之服务端封装

前言之前记录了Android中Socket的简单使用,也就是对数据的简单收发操作。这简单的对SocketServer进行封装。记录于此,方便自己查阅。正文SocketServer服务端一般不需要我们写,大多数是作为客户端去绑定其他的,比如Tbox。但服务端跟客户端差不多,因此也一起整理一下...