Android自定義滑動(dòng)驗(yàn)證條的示例代碼
本文介紹了Android自定義滑動(dòng)驗(yàn)證條的示例代碼,分享給大家,具體如下:
*注:不知道為什么,h5的標(biāo)簽在這里沒用了,所以我也只能用Markdown的語法來寫了
項(xiàng)目地址:https://github.com/994866755/handsomeYe.seekbar.github.io
需求:
在我們的某些應(yīng)用中需要滑動(dòng)驗(yàn)證。比如說這個(gè)樣子的:

剛開始我也很懵逼要怎么去弄,結(jié)果我去看了一些人的代碼,有人是用自定義viewgroup去做,就是viewgroup包含滑動(dòng)塊和滑動(dòng)條。但我覺得太麻煩,直到我知道android有個(gè)控件seekbar可以實(shí)現(xiàn)這個(gè)效果。
一、使用SeekBar實(shí)現(xiàn)滑動(dòng)條
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:max="100"
android:maxHeight="45dp"
android:minHeight="45dp"
android:progress="0"
android:clickable="false"
android:progressDrawable="@drawable/bg_forgotpassword_seekbar"
android:thumb="@drawable/bg_seekbar_thumb"
android:id="@+id/sb_progress"
android:thumbOffset="-1dp"
android:padding="1dp"
/>
這里網(wǎng)上有很多介紹,我也順便解釋一下:
(1)android:max是總共的容量,這里設(shè)100就行。
(2)android:progressDrawable是只設(shè)置進(jìn)度框的背景,就是整個(gè)條的背景,比如圖中的沒滑動(dòng)的時(shí)候是灰色,滑動(dòng)的地方是綠色。
(3)android:thumb這個(gè)屬性是設(shè)置滑塊的樣式,比如圖中的沒滑時(shí)是>>,滑到最右變成勾。默認(rèn)的樣式是一個(gè)圓。
(4)android:thumbOffset這個(gè)是滑塊的起始位置,怎么說呢,你可以當(dāng)圖中第一條的滑塊是android:thumbOffset = “0dp”,如果你設(shè)置成正數(shù),這個(gè)滑塊的位置會(huì)向左移動(dòng),設(shè)成負(fù)數(shù)會(huì)向右移動(dòng)。我這里設(shè)成-1是以為是0的時(shí)候會(huì)擋住左邊的邊框,這樣不好看,我設(shè)成-1為了讓滑塊向右移動(dòng)一點(diǎn)。
二、設(shè)置SeekBar樣式
寫好布局后來寫下樣式,也就是上面的progressDrawable和thumb屬性。
(1)progressDrawable(滑動(dòng)條)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--seekBar背景-->
<item android:id="@android:id/background">
<!--形狀-->
<shape android:shape="rectangle">
<!--大小-->
<size android:height="29dp" />
<!--圓角-->
<corners android:radius="2dp" />
<!--背景-->
<solid android:color="#E7EAE9" />
<!--邊框-->
<stroke
android:width="1dp"
android:color="#C3C5C4" />
</shape>
</item>
<!--seekBar的進(jìn)度條-->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="2dp" />
<solid android:color="#7AC23C" />
<stroke
android:width="1dp"
android:color="#C3C5C4" />
</shape>
</clip>
</item>
</layer-list>
(2)thumb(滑塊)
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按下狀態(tài)--> <item android:drawable="@mipmap/seekbar_thumb" android:state_pressed="true" /> <!-- 有焦點(diǎn)狀態(tài) --> <item android:drawable="@mipmap/seekbar_thumb" android:state_focused="true" /> <!-- 普通狀態(tài) --> <item android:drawable="@mipmap/seekbar_thumb" /> </selector>
這里就不多介紹了。
三、加入監(jiān)聽
在activity中加入監(jiān)聽,比如你可以讓滑塊不滑到最右時(shí)自動(dòng)彈回原位等等。
sbProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (seekBar.getProgress() != seekBar.getMax()) {
seekBar.setProgress(0);
}else {
sbProgress.setEnabled(false);
setData();
}
}
});
最后實(shí)現(xiàn)的效果是這樣:

你可以自己加文字在中間,這個(gè)我就不在demo里弄了。
四、剩下的處理
你以為這樣就完啦?那你太天真了,你會(huì)發(fā)現(xiàn)如果你按上面的步驟做,最后會(huì)有一個(gè)很蛋疼的效果:
你不滑動(dòng)滑塊,只點(diǎn)擊滑動(dòng)條中間,滑塊會(huì)馬上到中間。
也就是說我們想做的效果是只滑動(dòng)而不能點(diǎn)擊,僅僅做成這樣是沒辦法實(shí)現(xiàn)這個(gè)需求。
那怎么辦?我在網(wǎng)上找了很多文章,大多都是不能滑也不能點(diǎn),而我要的是能滑不能點(diǎn)。難道SeekBar沒戲啦?我想了想,最后我用事件分發(fā)來解決。
既然是事件分發(fā),我這里也不想寫事件分發(fā)的內(nèi)容,以后我們寫一篇專門關(guān)于事件分發(fā)的文章,這里如果有小伙伴不了解事件分發(fā)的話,自己先去google一下。
既然是事件分發(fā),那我們就需要自定義seekbar啦,其實(shí)很簡(jiǎn)單。我先貼代碼,然后再講解。
(1)代碼君:
public class VerificationSeekBar extends SeekBar{
//這兩個(gè)值為用算法使用的2空間復(fù)雜度
private int index = 150;
private boolean k = true;
public VerificationSeekBar(Context context) {
super(context);
}
public VerificationSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerificationSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int x = (int) event.getX();
if (event.getAction() == MotionEvent.ACTION_DOWN){
k = true;
if (x - index > 20) {
k = false;
return true;
}
}
if (event.getAction() == MotionEvent.ACTION_MOVE){
if (!k){
return true;
}
}
return super.dispatchTouchEvent(event);
}
}
(2)講解
為了方便講解,我把其它的內(nèi)容刪掉,就留關(guān)鍵方法,沒錯(cuò),就是dispatchTouchEvent。但是如果我不說,可能dispatchTouchEvent里面的代碼你會(huì)看得蒙。
先說說我的思想:簡(jiǎn)單來說就是你點(diǎn)擊的地方要在滑塊的范圍,才分發(fā)事件,不然retrun true不分發(fā)事件。所以有了x - index > 20,這里的index =150是我滑塊的大概寬度,所以要你點(diǎn)擊的地方在我滑塊的寬度的20像素直接我才分發(fā)事件。所以x - index > 20的話不分發(fā)。
int x = (int) event.getX(); 獲取點(diǎn)擊時(shí)的坐標(biāo),注意,是相對(duì)于view左上角的,而不是相對(duì)屏幕的。
我這里分別按順序判斷了event.getAction() == MotionEvent.ACTION_DOWN和event.getAction() ==MotionEvent.ACTION_MOVE,注意,是按順序。為什么要按順序呢?首先你自己測(cè)試你會(huì)發(fā)現(xiàn),點(diǎn)擊seekbar時(shí)ACTION_DOWN和ACTION_MOVE都會(huì)執(zhí)行,所以你不能光判定按下,還要判斷滑動(dòng)。那為什么不一起判斷而要按順序判定呢?因?yàn)橐黄鹋袛嗟脑捘憧梢栽囋?,你?huì)發(fā)現(xiàn)根本就滑不了。
而學(xué)過事件分發(fā)的都知道事件先執(zhí)行ACTION_DOWN再執(zhí)行ACTION_MOVE,所以先判斷點(diǎn)擊的地方是否在滑塊+20像素的范圍內(nèi),如果不在,定義一個(gè)布爾值k記錄不在,然后執(zhí)行 if (!k){return true;}
唉!感覺這個(gè)算法講得不是很好,聽不懂沒關(guān)系,你照抄就行,記得把index改成你滑塊的寬度就行。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義控件ScrollView實(shí)現(xiàn)上下滑動(dòng)功能
這篇文章主要為大家詳細(xì)介紹了Android自定義控件ScrollView實(shí)現(xiàn)上下滑動(dòng)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
python gstreamer實(shí)現(xiàn)視頻快進(jìn)/快退/循環(huán)播放功能
這篇文章主要介紹了python gstreamer 實(shí)現(xiàn)視頻快進(jìn)/快退/循環(huán)播放功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android TreeView效果實(shí)現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Android TreeView效果實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android TreeView效果的實(shí)現(xiàn)原理與具體技巧,并附帶demo源碼供讀者下載,需要的朋友可以參考下2016-02-02
Android開發(fā)之Sqliteopenhelper用法實(shí)例分析
這篇文章主要介紹了Android開發(fā)之Sqliteopenhelper用法,實(shí)例分析了SQLiteOpenHelper類操作數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Android gradle插件打印時(shí)間戳的方法詳解
這篇文章主要給大家介紹了關(guān)于Android gradle插件打印時(shí)間戳的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
Android 進(jìn)階實(shí)現(xiàn)性能優(yōu)化之OOM與Leakcanary詳解原理
LeakCanary 是大名鼎鼎的 square 公司開源的內(nèi)存泄漏檢測(cè)工具。目前上大部分App在開發(fā)測(cè)試階段都會(huì)接入此工具用于檢測(cè)潛在的內(nèi)存泄漏問題,做的好一點(diǎn)的可能會(huì)搭建一個(gè)服務(wù)器用于保存各個(gè)設(shè)備上的內(nèi)存泄漏問題再集中處理2021-11-11
Android實(shí)現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的方法
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)外部喚起應(yīng)用跳轉(zhuǎn)指定頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
android surfaceView實(shí)現(xiàn)播放視頻功能
這篇文章主要為大家詳細(xì)介紹了android surfaceView實(shí)現(xiàn)播放視頻功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

