国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義滑動驗證條的示例代碼

2019-10-22 18:29:40
字體:
來源:轉載
供稿:網友

本文介紹了android/247962.html">Android自定義滑動驗證條的示例代碼,分享給大家,具體如下:

*注:不知道為什么,h5的標簽在這里沒用了,所以我也只能用Markdown的語法來寫了

項目地址:https://github.com/994866755/handsomeYe.seekbar.github.io

需求:

在我們的某些應用中需要滑動驗證。比如說這個樣子的:

Android,滑動驗證條,自定義滑動條

剛開始我也很懵逼要怎么去弄,結果我去看了一些人的代碼,有人是用自定義viewgroup去做,就是viewgroup包含滑動塊和滑動條。但我覺得太麻煩,直到我知道android有個控件seekbar可以實現這個效果。

一、使用SeekBar實現滑動條

  <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"    />

這里網上有很多介紹,我也順便解釋一下:

(1)android:max是總共的容量,這里設100就行。

(2)android:progressDrawable是只設置進度框的背景,就是整個條的背景,比如圖中的沒滑動的時候是灰色,滑動的地方是綠色。

(3)android:thumb這個屬性是設置滑塊的樣式,比如圖中的沒滑時是>>,滑到最右變成勾。默認的樣式是一個圓。

(4)android:thumbOffset這個是滑塊的起始位置,怎么說呢,你可以當圖中第一條的滑塊是android:thumbOffset = “0dp”,如果你設置成正數,這個滑塊的位置會向左移動,設成負數會向右移動。我這里設成-1是以為是0的時候會擋住左邊的邊框,這樣不好看,我設成-1為了讓滑塊向右移動一點。

二、設置SeekBar樣式

寫好布局后來寫下樣式,也就是上面的progressDrawable和thumb屬性。

(1)progressDrawable(滑動條)

<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的進度條-->  <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">  <!-- 按下狀態-->  <item android:drawable="@mipmap/seekbar_thumb" android:state_pressed="true" />  <!-- 有焦點狀態 -->  <item android:drawable="@mipmap/seekbar_thumb" android:state_focused="true" />  <!-- 普通狀態 -->  <item android:drawable="@mipmap/seekbar_thumb" /></selector>

這里就不多介紹了。

三、加入監聽

在activity中加入監聽,比如你可以讓滑塊不滑到最右時自動彈回原位等等。

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();        }      }    });

最后實現的效果是這樣:

Android,滑動驗證條,自定義滑動條

你可以自己加文字在中間,這個我就不在demo里弄了。

四、剩下的處理

你以為這樣就完啦?那你太天真了,你會發現如果你按上面的步驟做,最后會有一個很蛋疼的效果:

你不滑動滑塊,只點擊滑動條中間,滑塊會馬上到中間。

也就是說我們想做的效果是只滑動而不能點擊,僅僅做成這樣是沒辦法實現這個需求。

那怎么辦?我在網上找了很多文章,大多都是不能滑也不能點,而我要的是能滑不能點。難道SeekBar沒戲啦?我想了想,最后我用事件分發來解決。

既然是事件分發,我這里也不想寫事件分發的內容,以后我們寫一篇專門關于事件分發的文章,這里如果有小伙伴不了解事件分發的話,自己先去google一下。

既然是事件分發,那我們就需要自定義seekbar啦,其實很簡單。我先貼代碼,然后再講解。

(1)代碼君:

public class VerificationSeekBar extends SeekBar{  //這兩個值為用算法使用的2空間復雜度  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)講解

為了方便講解,我把其它的內容刪掉,就留關鍵方法,沒錯,就是dispatchTouchEvent。但是如果我不說,可能dispatchTouchEvent里面的代碼你會看得蒙。

先說說我的思想:簡單來說就是你點擊的地方要在滑塊的范圍,才分發事件,不然retrun true不分發事件。所以有了x - index > 20,這里的index =150是我滑塊的大概寬度,所以要你點擊的地方在我滑塊的寬度的20像素直接我才分發事件。所以x - index > 20的話不分發。

int x = (int) event.getX(); 獲取點擊時的坐標,注意,是相對于view左上角的,而不是相對屏幕的。

我這里分別按順序判斷了event.getAction() == MotionEvent.ACTION_DOWN和event.getAction() ==MotionEvent.ACTION_MOVE,注意,是按順序。為什么要按順序呢?首先你自己測試你會發現,點擊seekbar時ACTION_DOWN和ACTION_MOVE都會執行,所以你不能光判定按下,還要判斷滑動。那為什么不一起判斷而要按順序判定呢?因為一起判斷的話你可以試試,你會發現根本就滑不了。

而學過事件分發的都知道事件先執行ACTION_DOWN再執行ACTION_MOVE,所以先判斷點擊的地方是否在滑塊+20像素的范圍內,如果不在,定義一個布爾值k記錄不在,然后執行 if (!k){return true;}

唉!感覺這個算法講得不是很好,聽不懂沒關系,你照抄就行,記得把index改成你滑塊的寬度就行。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西丰县| 屯昌县| 封开县| 武冈市| 漳浦县| 鞍山市| 建阳市| 历史| 申扎县| 娱乐| 台前县| 双城市| 肥乡县| 郑州市| 工布江达县| 延津县| 新河县| 楚雄市| 茶陵县| 从化市| 拜城县| 嘉祥县| 金川县| 新民市| 宝山区| 永州市| 中阳县| 祁连县| 宜良县| 长沙市| 兴业县| 屯昌县| 乡宁县| 昌图县| 大连市| 车险| 汾阳市| 汉寿县| 北宁市| 上蔡县| 巴林右旗|