最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View獲取注冊驗證碼倒計時按鈕

 更新時間:2016年10月25日 09:12:05   作者:DylanAndroid  
這篇文章主要介紹了Android自定義View獲取驗證碼倒計時按鈕的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在Android開發(fā)中,我們不可避免的會做到注冊功能,而現(xiàn)在的注冊大多數(shù)都是用手機去注冊的,那么注冊的時候都會要求用獲取驗證碼的方式去驗證,我們接下來就來實戰(zhàn)一下自定義獲取驗證碼倒計時按鈕:

1.先看效果圖

2.我們涉及到的變量

//倒計時時長,可設(shè)置

/**
 * 倒計時時長,默認(rèn)倒計時時間60秒;
 */
private long length = 60 * 1000;

//在點擊按鈕之前按鈕所顯示的文字

/**
 * 在點擊按鈕之前按鈕所顯示的文字,默認(rèn)是獲取驗證碼
 */
private String beforeText = "獲取驗證碼";

//在開始倒計時之后那個秒數(shù)數(shù)字之后所要顯示的字

/**
 * 在開始倒計時之后那個秒數(shù)數(shù)字之后所要顯示的字,默認(rèn)是秒
 */
private String afterText = "秒";

3.利用什么倒計時Timer

在Java中定時器任務(wù)的執(zhí)行需要兩個基本的類:
java.util.Timer;
java.util.TimerTask;

要運行一個定時任務(wù),最基本的步驟如下:
1、建立一個要執(zhí)行的任務(wù)TimerTask。
2、創(chuàng)建一個Timer實例,通過Timer提供的schedule()方法,將 TimerTask加入到定時器Timer中,同時設(shè)置執(zhí)行的規(guī)則即可。

當(dāng)程序執(zhí)行了Timer初始化代碼后,Timer定時任務(wù)就會按照設(shè)置去執(zhí)行。
Timer中的schedule()方法是有多種重載格式的,以適應(yīng)不同的情況。該方法的格式如下:
void schedule(TimerTask task, Date time)
安排在指定的時間執(zhí)行指定的任務(wù)。
void schedule(TimerTask task, Date firstTime, long period)
安排指定的任務(wù)在指定的時間開始進行重復(fù)的固定延遲執(zhí)行。
void schedule(TimerTask task, long delay)
安排在指定延遲后執(zhí)行指定的任務(wù)。
void schedule(TimerTask task, long delay, long period)
安排指定的任務(wù)從指定的延遲后開始進行重復(fù)的固定延遲執(zhí)行。
Timer是線程安全的,此類可擴展到大量同時安排的任務(wù)(存在數(shù)千個都沒有問題)。其所有構(gòu)造方法都啟動計時器線程??梢哉{(diào)用cancel() 終止此計時器,丟棄所有當(dāng)前已安排的任務(wù)。purge()從此計時器的任務(wù)隊列中移除所有已取消的任務(wù)。此類不提供實時保證:它使用 Object.wait(long) 方法來安排任務(wù)。
TimerTask是一個抽象類,由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。它有一個抽象方法run()—-計時器任務(wù)要執(zhí)行的操作。因此,每個具體的任務(wù)類都必須繼承TimerTask類,并且重寫run()方法。另外它還有兩個非抽象的方法:
boolean cancel()
取消此計時器任務(wù)。
long scheduledExecutionTime()
返回此任務(wù)最近實際 執(zhí)行的安排 執(zhí)行時間。

4.代碼

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;

import java.util.Timer;
import java.util.TimerTask;

/**
 * 自定義倒計時按鈕
 * <p/>
 *
 * @author Dylan
 *     [佛祖保佑 永無BUG]
 *     Created by Dylan on 2016/10/5 0005.
 */
public class CountdownButton extends Button implements View.OnClickListener {
  /**
   * 倒計時時長,默認(rèn)倒計時時間60秒;
   */
  private long length = 60 * 1000;
  /**
   * 開始執(zhí)行計時的類,可以在每秒實行間隔任務(wù)
   */
  private Timer timer;
  /**
   * 每秒時間到了之后所執(zhí)行的任務(wù)
   */
  private TimerTask timerTask;
  /**
   * 在點擊按鈕之前按鈕所顯示的文字,默認(rèn)是獲取驗證碼
   */
  private String beforeText = "獲取驗證碼";
  /**
   * 在開始倒計時之后那個秒數(shù)數(shù)字之后所要顯示的字,默認(rèn)是秒
   */
  private String afterText = "秒";
  /**
   * 按鈕點擊事件
   */
  private OnClickListener onClickListener;


  public CountdownButton(Context context) {
    super(context);
    initView();
  }

  public CountdownButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView();
  }

  public CountdownButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView();
  }

  /**
   * 初始化操作
   */
  private void initView() {
    if (!TextUtils.isEmpty(getText())) {
      beforeText = getText().toString().trim();
    }
    this.setText(beforeText);
    setOnClickListener(this);
  }

  /**
   * 初始化時間
   */
  private void initTimer() {
    timer = new Timer();
    timerTask = new TimerTask() {
      @Override
      public void run() {
        handler.sendEmptyMessage(1);
      }
    };
  }

  /**
   * 設(shè)置倒計時時長
   *
   * @param length 默認(rèn)毫秒
   */
  public void setLength(long length) {
    this.length = length;
  }

  /**
   * 設(shè)置未點擊時顯示的文字
   *
   * @param beforeText
   */
  public void setBeforeText(String beforeText) {
    this.beforeText = beforeText;
  }

  /**
   * 設(shè)置未點擊后顯示的文字
   *
   * @param beforeText
   */
  public void setAfterText(String beforeText) {
    this.afterText = afterText;
  }

  /**
   * 設(shè)置監(jiān)聽按鈕點擊事件
   *
   * @param onclickListener
   */
  @Override
  public void setOnClickListener(OnClickListener onclickListener) {
    if (onclickListener instanceof CountdownButton) {
      super.setOnClickListener(onclickListener);
    } else {
      this.onClickListener = onclickListener;
    }
  }

  /**
   * 點擊按鈕后的操作
   *
   * @param v
   */
  @Override
  public void onClick(View v) {
    start();
    if (onClickListener != null) {
      onClickListener.onClick(v);
    }
  }

  /**
   * 開始倒計時
   */
  public void start() {
    initTimer();
    this.setText(length / 1000 + afterText);
    this.setEnabled(false);
    timer.schedule(timerTask, 0, 1000);
  }


  /**
   * 更新顯示的文本
   */
  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      CountdownButton.this.setText(length / 1000 + afterText);
      length -= 1000;
      if (length < 0) {
        CountdownButton.this.setEnabled(true);
        CountdownButton.this.setText(beforeText);
        clearTimer();
        length = 60 * 1000;
      }
    }
  };

  /**
   * 清除倒計時
   */
  private void clearTimer() {
    if (timerTask != null) {
      timerTask.cancel();
      timerTask = null;
    }
    if (timer != null) {
      timer.cancel();
      timer = null;
    }
  }

  /**
   * 記得一定要在activity或者fragment消亡的時候清除倒計時,
   * 因為如果倒計時沒有完的話子線程還在跑,
   * 這樣的話就會引起內(nèi)存溢出
   */
  @Override
  protected void onDetachedFromWindow() {
    clearTimer();
    super.onDetachedFromWindow();
  }
}

5.用法,超級簡單

 <com.bm.ykzx.view.CountdownButton
        android:id="@+id/cdb_register_timer"
        android:layout_width="120dp"
        android:textAllCaps="false"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:paddingLeft="3dp"
        android:paddingRight="3dp"
        android:text="獲取驗證碼"
        android:textColor="#1179c4"
        android:textSize="@dimen/txt14sp" />

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開發(fā)中下拉刷新如何實現(xiàn)

    Android開發(fā)中下拉刷新如何實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Android開發(fā)中下拉刷新的實現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android編程使用GestureDetector實現(xiàn)簡單手勢監(jiān)聽與處理的方法

    Android編程使用GestureDetector實現(xiàn)簡單手勢監(jiān)聽與處理的方法

    這篇文章主要介紹了Android編程使用GestureDetector實現(xiàn)簡單手勢監(jiān)聽與處理的方法,簡單講述了Android手勢監(jiān)聽的原理并結(jié)合實例形式分析了GestureDetector實現(xiàn)手勢監(jiān)聽與處理的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Android自定義控件實現(xiàn)短信驗證碼自動填充

    Android自定義控件實現(xiàn)短信驗證碼自動填充

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件實現(xiàn)短信驗證碼自動填充,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android 圖文詳解Binder進程通信底層原理

    Android 圖文詳解Binder進程通信底層原理

    Android系統(tǒng)中,多進程間的通信都是依賴于底層Binder IPC機制,Binder機制是一種RPC方案。例如:當(dāng)進程A中的Activity與進程B中的Service通信時,就使用了binder機制
    2021-10-10
  • Activity配置、啟動和關(guān)閉activity實例詳解

    Activity配置、啟動和關(guān)閉activity實例詳解

    這篇文章主要介紹了Activity配置、啟動和關(guān)閉activity實例詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Android刷新加載框架詳解

    Android刷新加載框架詳解

    這篇文章主要為大家詳細(xì)介紹了Android刷新加載框架的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android中監(jiān)聽未接來電的2種方法

    Android中監(jiān)聽未接來電的2種方法

    這篇文章主要介紹了Android中監(jiān)聽未接來電的2種方法,本文講解了使用廣播接收器 BrocastReceiver和使用 PhoneStateListener二種方法,需要的朋友可以參考下
    2015-04-04
  • Flutter控件之實現(xiàn)Widget基類的封裝

    Flutter控件之實現(xiàn)Widget基類的封裝

    在實際的開發(fā)中,Widget的基類還是很有必要存在的,不然就會存在很多的冗余嵌套代碼,本文為大家介紹了Flutter中基類是如何封裝的,需要的可以收藏一下
    2023-05-05
  • Android嵌套滾動的傳統(tǒng)方法與思路

    Android嵌套滾動的傳統(tǒng)方法與思路

    Android嵌套滾動是在開發(fā)中經(jīng)常遇到的一個需求,這篇文章主要介紹了Android嵌套滾動的傳統(tǒng)方法與思路的相關(guān)資料,對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Android?iOS常用APP崩潰日志獲取命令方法

    Android?iOS常用APP崩潰日志獲取命令方法

    這篇文章主要為大家介紹了Android&iOS常用APP崩潰日志獲取命令方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

海南省| 邵阳市| 马鞍山市| 六枝特区| 宜阳县| 东乡县| 大洼县| 虞城县| 雷波县| 南昌市| 上虞市| 随州市| 志丹县| 特克斯县| 乌拉特前旗| 同江市| 济阳县| 通江县| 兴城市| 洮南市| 沾益县| 东辽县| 子长县| 深水埗区| 华池县| 砚山县| 资兴市| 泗阳县| 彰武县| 云林县| 诸暨市| 霍林郭勒市| 阳江市| 三河市| 桐梓县| 孝感市| 正宁县| 开阳县| 温泉县| 鱼台县| 闽侯县|