数字滚轮ScrollNumber
2017-02-16 19:41
330 查看
数字播放组件比较有名的是wuhaojie 编写的ScrollNumber。项目中就是基于此控件进行的定制和优化。
项目需要进行的一些需求:
1)需要设置数字的背景资源,数字和文字的背景资源不相同;
2)需要支持文字型的数字,例如“200亿50万”,数字滚动过程可能出现位数的增加和减少。
例如“9999”变化为“1万200”。
3)动画播放的特殊支持,例如:动画播放时从低位逐个开始播放,然后依次从高位开始停止。
1.0 ScrollNumber介绍
1.0.1 核心控件类
ScrollNumber包含两个核心类ScrollNumber和MultiScrollNumber。项目中最主要就是
对这两个类的优化和功能扩充。
ScrollNumber:单个数字的播放子控件,实现一个数字动画播放,例如从 1--》2。
这是一个内部使用类。
外部调用方法:setNumberChar:设置当前播放的起始数字和结束数字。
以及一些属性的设置方法: setTextSize:设置数字的字体大小
setUnitTextSize:设置文字的字体大小 等
MultiScrollNumber:数字播放器,通过多个ScrollNumber的组合实现数字的播放功能。
一个数字字符对应于一个ScrollNumber。例如“9000”播放到“9100”需要使用四个ScrollNumber。
外部使用方法:
setNumber:设置需要播放的数字(起始数字和目标数字),未设置起始数字默认时把
上一次播放的目标数字作为起始数字。只设置数字,不进行动画播放。播放使用play
方法。
这种方式适合
初始化和播放分开使用的模式。
ScrollNumber支持设置背景资源。
setNumberWithAnimation:设置数字并且进行动画播放。
setScrollAnimationMode:设置动画播放的模式。提供了五种模式:
START_FIRST_ARRIVAL_LAST:低位先启动低位后到达;
START_ARRIVAL_SAME_TIME:低位和高位同时启动同时到达
START_FIRST_ARRIVAL_FIRST:低位先启动低位先到达
CALENDAR:
台历模式。只有变化的位播放动画,按照数字顺序播放 0—>1-->2--->9-->0
SCOREBOARD:记分牌模式,只有变化的位播放动画,按照数字大小逐个递增或者逐个递减。
例如
3-->1 那么变化为3-->2-->1;而1-->3 为1-->2-->3。
1.0.2
数字动画播放规则
数字向上滚动时,例如数字从
0-->1。
canvas.translate(0,
mOffset * getMeasuredHeight());
drawSelf(canvas);
drawNext(canvas);
mOffset是位置偏移量百分比。当前数字是0,下一个数字是1,两者位置
0
------ ---->
1
------
通过偏移量,实现当前数字和下一个数字同步向上移动,当当前数字完全移除时(超过100%),
进入下一个数字。
1.0.3
动画播放加速器
采用标准的加速器,当然也可以自定义加速器。
1.0.4
动画播放模式的实现
因为项目要采用低位先启动,高位先到达的模式。要实现这个模式,算法上折腾了两天。
开始采用加速器调节,发现不能完全保证高位先到达;
后来又通过调整每个数字的移动百分比来实现,发现效果仍然不能完全正确;
才来采用了相同加速器和相同移动百分比,通过调整数字播放的步长来实现了。
即低位播放的数字步长多,因此播放时间长,高位播放步长少,因此播放时间端,先到达。
2.0
数字滚动变化规则
2.0.1
数字字符、文字字符滚动变化规则
*
1)数字切换到数字 0-->1-->2-->3-->4-->5-->6-->7-->8-->9
* 2)数字(文字或空白字符)切换到文字 文字-->文字
* 3)文字(空白字符)切换到数字 文字-->0...->数字
* 4)数字切换到无(空白字符) 数字-->消失(父类移除当前节点)
* 5)文字切换到无(空白字符) 文字-->消失(父类移除移除当前节点)
2.0.2
数字的格式化算法
格式化算法采用的按文字分组格式化算法。例如起始数字
100亿10,目标数字 101亿1万,
起始数字按照文字分组,分为两组
100亿 和 10两组, 目标数字也分为两组 101亿 和 1万两组,
1)每一个分组中
数字和数字对齐,位数不够高位补齐;文字和文字对话,数字补0,文字补空。
起始数字和目标数字格式化结果
100亿10空
101亿01万
2)起始数字存在目标数字对应项为空是,滚动过程此项将移除。
3)起始数字对应项为空,目标数字存在且为数字字符,起始数字可初始化为0。
项目请参考GitHub:
https://github.com/joedan0104/ScrollNumber
项目需要进行的一些需求:
1)需要设置数字的背景资源,数字和文字的背景资源不相同;
2)需要支持文字型的数字,例如“200亿50万”,数字滚动过程可能出现位数的增加和减少。
例如“9999”变化为“1万200”。
3)动画播放的特殊支持,例如:动画播放时从低位逐个开始播放,然后依次从高位开始停止。
1.0 ScrollNumber介绍
1.0.1 核心控件类
ScrollNumber包含两个核心类ScrollNumber和MultiScrollNumber。项目中最主要就是
对这两个类的优化和功能扩充。
ScrollNumber:单个数字的播放子控件,实现一个数字动画播放,例如从 1--》2。
这是一个内部使用类。
外部调用方法:setNumberChar:设置当前播放的起始数字和结束数字。
以及一些属性的设置方法: setTextSize:设置数字的字体大小
setUnitTextSize:设置文字的字体大小 等
MultiScrollNumber:数字播放器,通过多个ScrollNumber的组合实现数字的播放功能。
一个数字字符对应于一个ScrollNumber。例如“9000”播放到“9100”需要使用四个ScrollNumber。
外部使用方法:
setNumber:设置需要播放的数字(起始数字和目标数字),未设置起始数字默认时把
上一次播放的目标数字作为起始数字。只设置数字,不进行动画播放。播放使用play
方法。
这种方式适合
初始化和播放分开使用的模式。
ScrollNumber支持设置背景资源。
setNumberWithAnimation:设置数字并且进行动画播放。
setScrollAnimationMode:设置动画播放的模式。提供了五种模式:
START_FIRST_ARRIVAL_LAST:低位先启动低位后到达;
START_ARRIVAL_SAME_TIME:低位和高位同时启动同时到达
START_FIRST_ARRIVAL_FIRST:低位先启动低位先到达
CALENDAR:
台历模式。只有变化的位播放动画,按照数字顺序播放 0—>1-->2--->9-->0
SCOREBOARD:记分牌模式,只有变化的位播放动画,按照数字大小逐个递增或者逐个递减。
例如
3-->1 那么变化为3-->2-->1;而1-->3 为1-->2-->3。
1.0.2
数字动画播放规则
数字向上滚动时,例如数字从
0-->1。
canvas.translate(0,
mOffset * getMeasuredHeight());
drawSelf(canvas);
drawNext(canvas);
mOffset是位置偏移量百分比。当前数字是0,下一个数字是1,两者位置
0
------ ---->
1
------
通过偏移量,实现当前数字和下一个数字同步向上移动,当当前数字完全移除时(超过100%),
进入下一个数字。
1.0.3
动画播放加速器
采用标准的加速器,当然也可以自定义加速器。
1.0.4
动画播放模式的实现
因为项目要采用低位先启动,高位先到达的模式。要实现这个模式,算法上折腾了两天。
开始采用加速器调节,发现不能完全保证高位先到达;
后来又通过调整每个数字的移动百分比来实现,发现效果仍然不能完全正确;
才来采用了相同加速器和相同移动百分比,通过调整数字播放的步长来实现了。
即低位播放的数字步长多,因此播放时间长,高位播放步长少,因此播放时间端,先到达。
2.0
数字滚动变化规则
2.0.1
数字字符、文字字符滚动变化规则
*
1)数字切换到数字 0-->1-->2-->3-->4-->5-->6-->7-->8-->9
* 2)数字(文字或空白字符)切换到文字 文字-->文字
* 3)文字(空白字符)切换到数字 文字-->0...->数字
* 4)数字切换到无(空白字符) 数字-->消失(父类移除当前节点)
* 5)文字切换到无(空白字符) 文字-->消失(父类移除移除当前节点)
2.0.2
数字的格式化算法
格式化算法采用的按文字分组格式化算法。例如起始数字
100亿10,目标数字 101亿1万,
起始数字按照文字分组,分为两组
100亿 和 10两组, 目标数字也分为两组 101亿 和 1万两组,
1)每一个分组中
数字和数字对齐,位数不够高位补齐;文字和文字对话,数字补0,文字补空。
起始数字和目标数字格式化结果
100亿10空
101亿01万
2)起始数字存在目标数字对应项为空是,滚动过程此项将移除。
3)起始数字对应项为空,目标数字存在且为数字字符,起始数字可初始化为0。
项目请参考GitHub:
https://github.com/joedan0104/ScrollNumber