Android關(guān)于SeekBar無(wú)法點(diǎn)擊到最大值問(wèn)題解決方法記錄(推薦)
先說(shuō)一下問(wèn)題發(fā)現(xiàn)經(jīng)過(guò)吧,最近項(xiàng)目定制系統(tǒng)設(shè)置應(yīng)用,其中亮度條一開(kāi)始是0-255值變化,使用了SeekBar控件去調(diào)節(jié),后來(lái)需求變更將值劃分為10個(gè)等級(jí),也就是進(jìn)度條的max為9,可以說(shuō)一下子進(jìn)度條從0-255變成了0-9范圍縮小了很多,范圍縮小,控件沒(méi)有變,也就是每個(gè)進(jìn)度點(diǎn)到下一個(gè)進(jìn)度點(diǎn)的距離就變長(zhǎng)了,眾所周知,SeekBar是支持拖動(dòng)以及點(diǎn)擊兩種方式控制,在我無(wú)聊瞎點(diǎn)時(shí)發(fā)現(xiàn),我怎么點(diǎn),這個(gè)進(jìn)度條都無(wú)法通過(guò)點(diǎn)擊跳到最大值,瞬間也就從劃水模式變成認(rèn)真模式=_=||。順便也就寫(xiě)下來(lái)記錄一下,防止以后忘記。
經(jīng)過(guò)分析,其實(shí)問(wèn)題原因也大概是這樣的,SeekBar的進(jìn)度大家都知道返回是一個(gè)int的整形,那么這個(gè)整形怎么取呢?這里也不細(xì)說(shuō)各種判定,簡(jiǎn)略說(shuō)也就和我們平時(shí)計(jì)算一個(gè)線段平均分N段一樣,那么也就是每個(gè)進(jìn)度點(diǎn)都有一段范圍長(zhǎng)的,如上面我的范圍是0-9取值其實(shí)是10個(gè)數(shù),10個(gè)值所以我們進(jìn)度條肯定是將線段長(zhǎng)度分成9段[一條線段是有兩個(gè)端點(diǎn),取n個(gè)值就劃分成n-1段],那么也相當(dāng)于一個(gè)蛋糕只切了9份,那么最后肯定有一個(gè)數(shù)字分不到范圍,所以假設(shè)我們控件長(zhǎng)度是90,分0-9,,那么其實(shí)取給0的范圍是[0,10)這么一個(gè)集合,以此類推1的范圍則是[10,20)...略,所以分到最后也就最大值9沒(méi)分到范圍,這里說(shuō)的是范圍,因?yàn)辄c(diǎn)擊時(shí),是看點(diǎn)擊范圍在哪里然后給他移動(dòng)到代表那個(gè)范圍的點(diǎn),那么9到底在哪里呢?其實(shí)9也算有范圍,咳咳,打臉自己,其實(shí)9的范圍就是[90],沒(méi)錯(cuò),最大值,你只能取最后滿足它100%的數(shù)。所以不是點(diǎn)不到,而是這個(gè)點(diǎn)太難點(diǎn)到了。唉--平時(shí)話少,也不知道解釋得到位不到位,若還是不懂,可以自己實(shí)際用一個(gè)SeekBar把控件長(zhǎng)度定大一點(diǎn),取值的max定小一點(diǎn),然后自己體會(huì)一下吧= =!
那么為啥我們拖動(dòng)可以到最大值呢?其實(shí)這個(gè)很好解釋,因?yàn)橥蟿?dòng)時(shí)控件處理MOVE事件,大家應(yīng)該知道控件touch事件,你要抬起手這個(gè)焦點(diǎn)才會(huì)被釋放,所以我們一直拖,控件都會(huì)處理這個(gè)事件,而能到最大值原因是我們實(shí)際是拖到了或者超過(guò)最大值位置的點(diǎn)那么此時(shí)通過(guò)一系列計(jì)算判定也就跑到了最大值去了
說(shuō)完原因,那么接下來(lái)就說(shuō)一下解決方法吧,剛剛說(shuō)了,最大值的判定范圍太小了,那么思路就是擴(kuò)充最大值的判定范圍不就可以了么?
方法一:我們都知道控件除了本身實(shí)際長(zhǎng)度外,其實(shí)還有很多額外的量,如android:layout_marginXXX, android:paddingXXX,但是margin并不會(huì)計(jì)算在控件內(nèi)部范圍,但是padding就不一樣,所以我們可以通過(guò)增加padding從而增加點(diǎn)擊范圍,從而使得最大值的判定范圍增大。如增加個(gè)android:paddingRight="20dp" 我目前用的是這種
方法二:原理同上,不過(guò)是通過(guò)setTouchDelegate方法去增大觸控范圍,具體這個(gè)方法使用方式和局限性大家可以自己百度[我就是這么懶=_=|]
方法三:還有一種方法那就是自己重新處理相關(guān)touch事件,修改范圍判定算法,把蛋糕重新切一下,如把8的判定改成是[80,85)那么剩下的就分給9之類的,這算是一個(gè)最好的解決方法,也是最麻煩的[所以我懶,也沒(méi)去做],僅提供思路。
以上所述是小編給大家介紹的Android關(guān)于SeekBar無(wú)法點(diǎn)擊到最大值問(wèn)題解決方法詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 可拖動(dòng)的seekbar自定義進(jìn)度值
- Android利用SeekBar實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器
- Android 中Seekbar詳解及簡(jiǎn)單實(shí)例
- Android自定義SeekBar實(shí)現(xiàn)視頻播放進(jìn)度條
- Android控件之SeekBar的用法總結(jié)
- Android控件SeekBar仿淘寶滑動(dòng)驗(yàn)證效果
- Android 動(dòng)態(tài)改變SeekBar進(jìn)度條顏色與滑塊顏色的實(shí)例代碼
- Android自定義豎直方向SeekBar多色進(jìn)度條
- android之SeekBar控件用法詳解
- Android自定義SeekBar滑動(dòng)顯示數(shù)字
相關(guān)文章
Android實(shí)現(xiàn)ListView分頁(yè)自動(dòng)加載數(shù)據(jù)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView分頁(yè)自動(dòng)加載數(shù)據(jù)的方法,涉及Android生成listview列表的相關(guān)技巧,需要的朋友可以參考下2015-12-12基于Android實(shí)現(xiàn)百度地圖定位過(guò)程詳解
這篇文章主要介紹了基于Android實(shí)現(xiàn)百度地圖定位過(guò)程詳解,需要的朋友可以參考下2015-11-11android編程實(shí)現(xiàn)圖片庫(kù)的封裝方法
這篇文章主要介紹了android編程實(shí)現(xiàn)圖片庫(kù)的封裝方法,涉及Android針對(duì)圖片的下載、保存、獲取及操作緩存圖片等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android App開(kāi)發(fā)中創(chuàng)建Fragment組件的教程
這篇文章主要介紹了Android App開(kāi)發(fā)中創(chuàng)建Fragment的教程,Fragment是用以更靈活地構(gòu)建多屏幕界面的可UI組件,需要的朋友可以參考下2016-05-05Android自定義ViewGroup之FlowLayout(三)
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup之FlowLayout,常用于關(guān)鍵字標(biāo)簽,搜索熱詞列表等功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09基于Flutter制作一個(gè)心碎動(dòng)畫(huà)特效
這篇文章主要為大家介紹了如何利用Flutter制作一個(gè)心碎動(dòng)畫(huà)特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Flutter有一定幫助,感興趣的可以了解一下2022-04-04Android編程使用AlarmManager設(shè)置鬧鐘的方法
這篇文章主要介紹了Android編程使用AlarmManager設(shè)置鬧鐘的方法,結(jié)合具體實(shí)例分析了Android基于AlarmManager實(shí)現(xiàn)鬧鐘功能的設(shè)置、取消、顯示等相關(guān)操作技巧,需要的朋友可以參考下2017-03-03