ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-04-12 11:49:08  阅读:283  来源: 互联网

标签:控件 10 SeekBar 最大值 判定 Android 范围


先说一下问题发现经过吧,最近项目定制系统设置应用,其中亮度条一开始是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之类的,这算是一个最好的解决方法,也是最麻烦的[所以我懒,也没去做],仅提供思路。

 

标签:控件,10,SeekBar,最大值,判定,Android,范围
来源: https://blog.csdn.net/qq_35658173/article/details/89226576

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有