android实现验证码按钮

开发过程中会遇见很多app注册时,需要通过手机发送验证码验证 ,这是可以封装一个验证码按钮:

attrs.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<?xml version="1.0" encoding="utf-8"?>

<resources>

<declare-styleable name="VerifyCodeButton">

<!--默认背景-->

<attr name="android:background" />

<!--点击后背景-->

<attr name="clickedBackground" format="reference" />

<!--倒计时间-->

<attr name="countdownTime" format="integer" />

<!--倒计时间后提示文字-->

<attr name="countdownText" format="string" />

</declare-styleable>

</resources>

自定义Button

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

public class VerifyCodeButton extends Button {

private Context mContext;

private int mClickedBackground;//点击后背景

private int mBackground;//当前背景

private String mCountdownownText;

private int mCountdownTime = 60;

private TimeCount mTimeCount;

public VerifyCodeButton(Context context) {

this(context, null);

}

public VerifyCodeButton(Context context, AttributeSet attrs) {

this(context, attrs, android.R.attr.buttonStyle);

}

public VerifyCodeButton(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mContext = context;

initAttrs(attrs);

init();

}

private void initAttrs(AttributeSet attrs) {

TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.VerifyCodeButton);

mBackground = typedArray.getResourceId(R.styleable.VerifyCodeButton_android_background, mBackground);

mClickedBackground = typedArray.getResourceId(R.styleable.VerifyCodeButton_clickedBackground, mClickedBackground);

mCountdownTime = typedArray.getInt(R.styleable.VerifyCodeButton_countdownTime, mCountdownTime);

mCountdownownText = typedArray.getString(R.styleable.VerifyCodeButton_countdownText);

typedArray.recycle();

}

private void init() {

setBackgroundResource(mBackground);

mTimeCount = new TimeCount(mCountdownTime * 1000, 1000);

}

/**

* 开始计时

*/

public void start() {

mTimeCount.start();

}

/**

* 取消计时

*/

public void cancle() {

mTimeCount.cancel();

setClickable(true);

setText(mCountdownownText != null ? mCountdownownText : "");

setBackgroundResource(mBackground);

}

class TimeCount extends CountDownTimer {

/**

* @param millisInFuture 总时间

* @param countDownInterval 间隔时间

*/

public TimeCount(long millisInFuture, long countDownInterval) {

super(millisInFuture, countDownInterval);

}

/**

* @param millisUntilFinished 当前时间

*/

@Override

public void onTick(long millisUntilFinished) {

setClickable(false);

setText(String.valueOf(millisUntilFinished / 1000 + "s"));

setBackgroundResource(mClickedBackground);

}

@Override

public void onFinish() {

setClickable(true);

setText(mCountdownownText != null ? mCountdownownText : "");

setBackgroundResource(mBackground);

}

}

}

自定义2个drawable

?

1

2

3

4

5

6

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"

android:shape="rectangle">

<corners android:radius="5dp" />

<solid android:color="#feacc3" />

</shape>

?

1

2

3

4

5

6

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"

android:shape="rectangle">

<corners android:radius="5dp" />

<solid android:color="#999999" />

</shape>

layout.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.sample.verify.MainActivity">

<com.sample.verify.widget.VerifyCodeButton

android:id="@+id/btn_verify_code"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:layout_margin="10dp"

android:background="@drawable/bg_btn_default"

android:gravity="center"

android:text="获取验证码"

android:textColor="#ffffff"

android:textSize="14sp"

app:clickedBackground="@drawable/bg_btn_clicked"

app:countdownText="重新获取"

app:countdownTime="10" />

<Button

android:id="@+id/btn_cancle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="取消倒计时" />

</LinearLayout>

Activity

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

package com.sample.verify;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

import com.sample.verify.widget.VerifyCodeButton;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private VerifyCodeButton btn_verify_code;

private Button btn_cancle;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setTitle("验证码");

btn_verify_code = (VerifyCodeButton) findViewById(R.id.btn_verify_code);

btn_cancle = (Button) findViewById(R.id.btn_cancle);

btn_verify_code.setOnClickListener(this);

btn_cancle.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_verify_code:

btn_verify_code.start();

break;

case R.id.btn_cancle:

btn_verify_code.cancle();

break;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if (btn_verify_code != null) {

btn_verify_code.cancle();

}

}

}

代码下载:android实现验证码按钮

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_14876133/article/details/80913886

本文链接:https://my.lmcjl.com/post/9820.html

展开阅读全文

4 评论

留下您的评论.