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

先说一下问题发现经过吧,最近项目定制系统设置应用,其中亮度条一开始是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无法点击到最大值问题解决方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android自定义SeekBar滑动显示数字

    先来上个效果图: 当滑动时:数值显示,滑动停止时显示数字,使用FrameLayout结合SeekBar. 首先我们看看. Layout: <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.c

  • Android利用SeekBar实现简单音乐播放器

    一.Demo简介  利用AIDL为Activity绑定服务,利用Handler机制,发送消息更新SeekBar的UI,利用计时器定时更新SeekBar的进度.实现对音乐的开始播放,到暂停,继续,以及停止播放的功能.以及实现拖动进度条播放音乐的功能. 二.AIDL接口  利用AIDL机制提供给MainActivity访问MyMusicService的方法,实现播放暂停等功能. 三.主要类代码 1.MyMusicService package my.com.mymusicp; import andr

  • android之SeekBar控件用法详解

    MainActivity.java package com.example.mars_2400_seekbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import a

  • Android 中Seekbar详解及简单实例

    Android 中Seekbar详解及简单实例 做到音频播放和音乐播放时,大多数都要用到Seekbar.现在我先简单介绍下Seekbar的几个重要属性. android:max 设置值的大小 . android:thumb="@drawable/" 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可. android:thumbOffset 拖动图标的偏量值,可以让拖动图标超过bar的

  • Android控件之SeekBar的用法总结

    1 SeekBar简介 SeekBar是进度条.我们使用进度条时,可以使用系统默认的进度条:也可以自定义进度条的图片和滑块图片等. 2 SeekBar示例 创建一个activity,包含2个SeekBar. 第1个SeekBar是系统默认的SeekBar. 第2个SeekBar是自定义SeekBar,使用自定义的背景图和滑块图片. 应用层代码 package com.skywang.control; import android.os.Bundle; import android.app.Act

  • Android 动态改变SeekBar进度条颜色与滑块颜色的实例代码

    遇到个动态改变SeekBar进度条颜色与滑块颜色的需求,有的是根据不同进度改变成不同颜色. 对于这个怎么做呢?大家都知道设置下progressDrawable与thumb即可,但是这样设置好就是确定的了,要动态更改需要在代码里实现. 用shape进度条与滑块 SeekBar设置 代码里动态设置setProgressDrawable与setThumb 画图形,大家都比较熟悉,background是背景图,secondaryProgress第二进度条,progress进度条: <layer-list

  • Android自定义SeekBar实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在SeekBar右边有一个文本框显示当前播放时间/总时间. step1.先来看一看PopupWindow的布局文件,seek_popu.xml,效果如下图所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLa

  • Android控件SeekBar仿淘宝滑动验证效果

    SeekBar是一个拖动条控件,最简单的案例就是我们的调节音量,还有音频视频的播放,传统的SeekBar样式,如图 传统的实现太简单,不足以让我们到能装逼的地步.本来是打算实现滴滴出行滑动完成订单的效果,可惜找不到效果图,今天也就用淘宝的滑动验证来作为实例 1.1 实现分析 SeekBar:使用progressDrawable属性自定义SeekBar 拖动块:使用thumb属性更改,其实就是一张图片 文字:使用RelativeLayout嵌套在一起 1.2 实现布局 <?xml version=

  • Android 可拖动的seekbar自定义进度值

    最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动.下面通过此图给大家展示下效果,可能比文字描述要更清晰. 其实实现起来很简单,主要是思路.自定义控件的话也不难,之前我的博客也有专门介绍,这里就不再多说. 实现方案 这里是通过继承seekbar来自定义控件,这样的方式最快.主要难点在于进度的显示,其实我很的是最笨的方法,就是用了一个popwindow显示在进度条的上方,然后在移动滑块的时候实时的改变它显示的横坐标.看进度显示的核心代码: private

  • Android自定义竖直方向SeekBar多色进度条

    写在前面 因为有这样的一个场景,需要实现竖直方向的多色进度条,然后在网上也找了下,没看到符合需要的,于是自定义了一个,效果如下: 具体实现 本来想定义水平的,然后旋转一下,后来发现还不如直接定义竖直方向来的直接,就直接在竖直方向画了下. 首先讲一下思路,就是通过继承View,然后通过onDraw()方法进行绘制.具体绘制的时候,需要处理一些小细节. 比如,我们需要画一个圆形的滑动块,那么我们的背景色带就不能把整个宽度占满,要不然,小圆块只能和色带一样宽了,效果不是很好看,所以在绘制的时候应该把背

随机推荐