您的位置:首页 > 移动开发 > Android开发

数字滚轮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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android java ScrollNumber