当前位置 : 主页 > 手机开发 > android >

Android关于SeekBar无法点击到最大值问题解决方法记

来源:互联网 收集:自由互联 发布时间:2021-05-17
先说一下问题发现经过吧,最近项目定制系统设置应用,其中亮度条一开始是0-255值变化,使用了SeekBar控件去调节,后来需求变更将值划分为10个等级,也就是进度条的max为9,可以说一

先说一下问题发现经过吧,最近项目定制系统设置应用,其中亮度条一开始是0-255值变化,使用了SeekBar控件去调节,后来需求变更将值划分为10个等级,也就是进度条的max为9,可以说一下子进度条从0-255变成了0-9范围缩小了很多,范围缩小,控件没有变,也就是每个进度点到下一个进度点的距离就变长了,众所周知,SeekBar是支持拖动以及点击两种方式控制,在我无聊瞎点时发现,我怎么点,这个进度条都无法通过点击跳到最大值,瞬间也就从划水模式变成认真模式=_=||。顺便也就写下来记录一下,防止以后忘记。

经过分析,其实问题原因也大概是这样的,SeekBar的进度大家都知道返回是一个int的整形,那么这个整形怎么取呢?这里也不细说各种判定,简略说也就和我们平时计算一个线段平均分N段一样,那么也就是每个进度点都有一段范围长的,如上面我的范围是0-9取值其实是10个数,10个值所以我们进度条肯定是将线段长度分成9段[一条线段是有两个端点,取n个值就划分成n-1段],那么也相当于一个蛋糕只切了9份,那么最后肯定有一个数字分不到范围,所以假设我们控件长度是90,分0-9,,那么其实取给0的范围是[0,10)这么一个集合,以此类推1的范围则是[10,20)...略,所以分到最后也就最大值9没分到范围,这里说的是范围,因为点击时,是看点击范围在哪里然后给他移动到代表那个范围的点,那么9到底在哪里呢?其实9也算有范围,咳咳,打脸自己,其实9的范围就是[90],没错,最大值,你只能取最后满足它100%的数。所以不是点不到,而是这个点太难点到了。唉--平时话少,也不知道解释得到位不到位,若还是不懂,可以自己实际用一个SeekBar把控件长度定大一点,取值的max定小一点,然后自己体会一下吧= =!

那么为啥我们拖动可以到最大值呢?其实这个很好解释,因为拖动时控件处理MOVE事件,大家应该知道控件touch事件,你要抬起手这个焦点才会被释放,所以我们一直拖,控件都会处理这个事件,而能到最大值原因是我们实际是拖到了或者超过最大值位置的点那么此时通过一系列计算判定也就跑到了最大值去了

说完原因,那么接下来就说一下解决方法吧,刚刚说了,最大值的判定范围太小了,那么思路就是扩充最大值的判定范围不就可以了么?

方法一:我们都知道控件除了本身实际长度外,其实还有很多额外的量,如android:layout_marginXXX, android:paddingXXX,但是margin并不会计算在控件内部范围,但是padding就不一样,所以我们可以通过增加padding从而增加点击范围,从而使得最大值的判定范围增大。如增加个android:paddingRight="20dp" 我目前用的是这种

方法二:原理同上,不过是通过setTouchDelegate方法去增大触控范围,具体这个方法使用方式和局限性大家可以自己百度[我就是这么懒=_=|]

方法三:还有一种方法那就是自己重新处理相关touch事件,修改范围判定算法,把蛋糕重新切一下,如把8的判定改成是[80,85)那么剩下的就分给9之类的,这算是一个最好的解决方法,也是最麻烦的[所以我懒,也没去做],仅提供思路。

以上所述是小编给大家介绍的Android关于SeekBar无法点击到最大值问题解决方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对自由互联网站的支持!

网友评论