0代码0侵入的安卓骨架屏框架----二期优化

news2024/11/19 5:25:18

本文是对自定义骨架屏框架的优化说明。

针对目前对骨架屏的需求及为了实现骨架屏而付出的繁重劳动,而设计的一款0编码0业务侵入的骨架屏框架。感兴趣的可以先去看看这篇文章:一种简单的Android骨架屏实现方案----0侵入0成本

额,如果不看,其实可能也不理解这篇是在说什么(⊙o⊙)…

 列表样式优化

将列表的 item UI样式二维数组化,通过配置对应的二维坐标,来实现列表样式到骨架屏灰条的准确映射。

问题

列表样式的妥协始终是一个无法抹去的问题,虽说一个项目的列表按理来说应该就几种主要样式,但实际列表都是各不相同的。原始列表样式到骨架屏灰块样式无法准确对应,再多的理由也无法说服产品同学妥协。

且从用户的角度来看,确实是一种非友好的体验,虽然可能并不影响用户使用。
从开发者的角度来看,这种妥协即使有补救的措施,但方式上并不可取。开发者在自定义样式时是需要直接修改源码的。很显然,违背了设计模式的原则-开闭原则:对修改关闭,对扩展开放。
用一句通俗的话来说,那就是不够优雅啊。


那如何优雅的实现定制化的列表灰块样式呢,并且依然尽可能少的敲代码?


灵感来源

框架之前内置了三种简单的列表样式(上文有提及和配图)。在完善代码注释的时候,想告诉开发者这三种样式是什么样子的。但是注释里又不能配图,如何表达呢?思来想去之际,脑海中忽然闪现过这个注释图:

可以用标点符号拼出一个图来示意。于是框架中就有了下面这段注释。

style 1 表示左边是图片,右边跟着两行字符串
style 2 表示上面是一个方图,下面跟着两行字符串。

不知大家能否看出来,这些组合是不就是一个二维数组,有的是1,表示灰色单位,多个1连起来就是一条灰块。有的是0,表示空白。

对于style 1来说,是不就是一个类似这样的二维数组:

表示,将屏幕宽度均分为 8 列,
第一行,坐标从0到1的位置值是1 ,表示是灰色,坐标从3到7的位置值是1 ,表示灰色,其余位置为0 ,表示空白。
第二行,坐标从0到1的位置值是1 ,表示是灰色,坐标从3到7的位置值是1 ,表示灰色,其余位置为0 ,表示空白。


方案设计

通过组装一个ItemParams 类型的对象,来实现定制列表样式。
listviewItemType 依然是用来配置列表样式的字段,其值改为 ItemParams 类类型

class ItemParams(var params: List<LineSegmentGroup>) {
    var columnNum = 20  //表示屏幕宽度分成多少列,影响的是一个单位的灰块的大小
    var rowNum = 10  //行数,暂时没用


   //将灰块按行分组
    class LineSegmentGroup(
        var line: Int, //行数
        var graySegments: List<GraySegment>  //当前行内的  各个灰块片段
    )

   //一个灰块片段, segment表示片段的起始坐标,mergeGap表示当前灰块和上一行的灰块是否融合为一起,没有间隙。
    class GraySegment(var segment: Pair<Int, Int>, var mergeGap: Boolean = false)
}

上面的二维数组转换成代码配置如下:

val line0 = ItemParams.LineSegmentGroup(
    0,
    listOf(
        ItemParams.GraySegment(0 to 1),
        ItemParams.GraySegment(3 to 7)
    )
)
val line1 = ItemParams.LineSegmentGroup(
    1,
    listOf(
        ItemParams.GraySegment(0 to 1, mergeGap = true),
        ItemParams.GraySegment(3 to 7)
    )
)

val itemType = ItemParams(listOf(line0, line1))
itemType.columnNum = 8

listviewItemType  =itemType //配置完毕

灰块如何计算出来的呢?


首先在父view RecyclerView或者listView 的Rect 范围内,将 rect按找 列数切分为一个个单元,然后根据配置的片段的起止坐标,来计算出灰块片段的长度,即 灰块rect 的 left和 right。根据当前所在的行数,来计算出灰块rect 的高度,即 top和bottom值。

不太清楚在说什么的还是建议去看一下之前的文章:
一种简单的Android骨架屏实现方案----0侵入0成本

项目实例

我们要实现下面列表UI的骨架屏灰块展示

我们可以大概将一个item对应到一个 8 × 10 的二维数组

展示UI的地方,就是红框围起来的,也就是骨架屏时要展示出灰色的地方,也就是数组值为1 的地方。

再将上面这个item准确的映射到一个数组中,黄色即灰块的位置。

0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7

一个item的骨架屏样式就变成了一个包含着 0和1值的二维数组,
LineSegmentGroup类: 表示一行,其中包含本行中的各个小灰块,
line: 行数,
graySegments: 本行内的灰块列表

GraySegment类:表示一块单独的灰块片段
segment:Pair<Int, Int>: 表示一个灰块的从左到右的起止点坐标,
mergeGap: 表示是否顶部和上一行合并,即不保留此灰块的行间隙。
 

对应到代码配置中:

config {
    listviewItemType = ItemParams(
        listOf(
            ItemParams.LineSegmentGroup(
                line = 0,
                graySegments = listOf(
                    ItemParams.GraySegment(0 to 1),
                    ItemParams.GraySegment(3 to 5),
                    ItemParams.GraySegment(8 to 9),
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 1,
                graySegments = listOf(
                    ItemParams.GraySegment(0 to 1, true),
                    ItemParams.GraySegment(3 to 5),
                    ItemParams.GraySegment(9 to 9)
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 2,
                graySegments = listOf(
                    ItemParams.GraySegment(0 to 1, true),
                    ItemParams.GraySegment(3 to 7)
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 4,
                graySegments = listOf(
                    ItemParams.GraySegment(3 to 9)
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 5,
                graySegments = listOf(
                    ItemParams.GraySegment(3 to 9)
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 6,
                graySegments = listOf(
                    ItemParams.GraySegment(3 to 4),
                    ItemParams.GraySegment(6 to 7)
                )
            ),
            ItemParams.LineSegmentGroup(
                line = 7,
                graySegments = listOf(
                    ItemParams.GraySegment(3 to 6),
                    ItemParams.GraySegment(8 to 8),
                    ItemParams.GraySegment(9 to 9)
                )
            )

            )
    )
    loadingAnim = ILoadingAnimtor.TYPE_BAI_JV_GUO_XI
    skeletonEnable = true
    customLoadingAnim = null
}

 展示出的骨架屏效果:

如果想要继续的精细化展示,需要调整分隔的最小块单元大小即可。
即调整对应的表格的行列长度。
ItemParams 类的两个参数:
columnNum: 将屏幕宽度分隔成多少行
rowNum: item 最多由多少行组成,这个参数目前没用,

也就是说  columnNum 值越大,越精细还原item样式。

下面的效果是将 columnNum 设置为20 的 灰块效果,

对比一下:

喜欢的小伙伴,快去愉快的用起来吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玻色量子成功研制光量子计算专用光纤恒温控制设备——“量晷”

​近日&#xff0c;北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;成功研制出一款高精度量子计算专用光纤恒温控制设备——“量晷”&#xff0c;该设备能将光纤的温度变化稳定在千分之一摄氏度量级&#xff0c;即能够做到0.001C的温度稳定维持&#xf…

5道谷歌面试题:即使是天才也要怀疑自己能力了(附GPT4答案)

谷歌google&#xff0c;美国的跨国科技企业&#xff0c;致力于互联网搜索、云计算、广告技术等领域&#xff0c;开发并提供大量基于互联网的产品与服务。 这样一家实力雄厚前景无量的公司是众多求职者梦寐以求的地方&#xff0c;然而&#xff0c;谷歌的面试题却把很多优秀人才…

技术贴 | 一文掌握 Google Test 框架

一、简介 1. 引言 在开发过程中&#xff0c;如何保证代码的质量以及程序的正确性成为了我们亟需解决的问题&#xff0c;其中测试用例成为了不必可少的一部分。测试用例不仅可以帮助我们验证代码的正确性&#xff0c;还能帮助我们捕获潜在的错误&#xff0c;提高代码的可靠性和…

IO模块:钢铁安全绿色生产的智能化助手

钡铼I/O模块以其卓越的性能和可靠性&#xff0c;为钢铁行业的安全绿色生产提供了强有力的支持。这个模块拥有出色的实时监测功能&#xff0c;能够精确捕捉现场设备的工作状态&#xff0c;确保设备的正常运行。通过采用先进的预测性维护技术&#xff0c;钡铼I/O模块能够提前发现…

传统金融机构加入代币化浪潮,新一轮加密周期的重要组成部分?

新加坡金融管理局 (MAS) 成立了由日本金融厅 (FSA)、英国金融行为监管局 (FCA) 和瑞士金融市场监管局 (FINMA) 组成“守护者计划”政策制定者组&#xff08;Project Guardian&#xff09;&#xff0c;正在计划对固定收益、外汇和资产管理产品进行资产代币化试点&#xff0c;以推…

Python 的 Web 自动化测试的实践

Web 测试是软件测试中比较重要的一个分支&#xff0c;而要实现 Web 自动化测试则要求测试人员能熟练掌握自动化测试工具和编程语言。介绍免费开源的 Web 测试工具 Selenium&#xff0c;以及流行的编程语言 Python。根据自动化测试的原理&#xff0c;对网页元素的常用定位方式&a…

smartLink HW-DP新版提供更多扩展功能——用于PROFIBUS和HART系统中物联网集成

Softing工业自动化的smartLink HW-DP网关可独立于控制器访问PROFIBUS DP网络&#xff0c;且新发布的1.30固件版本还提供了更多数据连接和传输的扩展功能。 smartLink HW-DP可无缝集成到PROFIBUS网络中&#xff0c;而不会影响现有设备的运行。该网关还可为新的和现有的PROFIBUS …

非常爆火的流量卡推广上线了

流量卡推广可以通过“聚量推文”申请&#xff0c;一手渠道 现在非常火的推广项目就是流量卡推广了&#xff0c;佣金价格高 普遍的价格是几十上百块&#xff0c;你一天推广10个收入就接近4位数&#xff0c;还是比较可观的 聚量推客专注于app拉新&#xff0c;网推项目&#xff…

博客系统-项目测试

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

MyBatis-Plus使用——配置yml参数 常用的注解@Table,@TableId,@IdType,@TableField,CRUD的API接口

前言 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 本系列博客结合实际应用场景&#xff0c;阐述MyBatis-Plus实际…

Python开发技能实战-通过配置的代理服务器在具有外网连接的环境中在Pycharm中运行python代码

实现功能 打开科学上网工具&#xff0c;使得能够在浏览器科学上网&#xff0c;通过科学上网工具的配置文件&#xff0c;可以看出本地和远程代理的映射关系&#xff0c;此时&#xff0c;远程地址本地地址&#xff0c;远程端口本地端口。 1、在程序中配置请求网页代理请求。不需…

GTS GtsUnofficialApisUsageTestCases Failed

GTS 测试GtsUnofficialApisUsageTestCases失败如下&#xff1a; junit.framework.AssertionFailedError: There are 102 violation(s) com.google.android.gm / Landroid/window/BackEvent;->getProgress()F / BLOCKED / LINKING com.google.android.gm / Landroid/window/…

java参数中的-、--、-X、-XX、-D

详细描述请参考&#xff1a;https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html Java标准选项&#xff08;以-、或者–开头&#xff09; Java标准选项被所有的Java虚拟机&#xff08;JVM&#xff09;实现所支持。 这些选项用于普通的动作&#xff0c;例如检…

服务器数据恢复-VSAN环境下ESXI虚拟机无法访问的数据恢复方案

一、用户信息&#xff1a; 广东某单位 二、数据恢复环境&#xff1a; 主机操作系统&#xff1a;ESXI 分区类型&#xff1a;VSAN 存储介质清单 &#xff1a;一共8台服务器节点&#xff0c;每节点2个磁盘组&#xff0c;其中1个磁盘组配置1块SSD固态硬盘&#xff0c;4块1.2T机…

【unity3D】Debug方法(如何在console面板中输出红色的错误信息)

&#x1f4a6;本专栏是我关于游戏开发的笔记 &#x1f236;本篇是一个简短的小知识点 Debug方法 介绍常用方法 介绍 Unity中的Debug方法可以用来输出一些调试信息&#xff0c;帮助开发者查找代码中的错误和问题。 常用方法 Debug.Log()&#xff1a;最常用的Debug方法之一&am…

表白墙(服务器)

目录 0.需求 1.创建Maven项目 2.给pom.xml内引入三个依赖 3.完善目录&#xff0c;并补充web.xml中的内容 4.编写代码 后端代码 ​编辑前端代码 5.引入数据库 创建message表 创建工具类 往MessageServlet类中添加方法 0.需求 前面写好了表白墙页面&#xff0c;但存…

视阅口译有何特点,哪里提供视阅口译翻译?

据了解&#xff0c;视阅口译是一种涉及视听和口头表达的翻译方式&#xff0c;它在跨文化交流等领域中起到了非常重要的作用。那么&#xff0c;视阅口译有何特点&#xff0c;哪里提供专业的视阅口译服务&#xff1f; 我们知道&#xff0c;视阅口译就是基于事先准备好的讲稿或文…

“构建高效的Java Web开发环境及前后端分离后台接口部署“

目录 引言一、安装环境&#xff1a;JDK和Tomcat1. 安装JDK下载jdk配置环境变量2. 安装Tomcat 二、安装MySQL三、部署前后端分离后台接口总结 引言 在现代软件开发中&#xff0c;构建高效的开发环境和部署稳定的后台接口是至关重要的。本文将介绍如何安装和配置Java开发环境&am…

一文2000字使用JMeter进行接口测试教程!(建议收藏)

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Cho…