这篇文章主要介绍了Android通过自定义View实现随机验证码的相关资料,需要的朋友可以参考下
这篇文章主要介绍了Android通过自定义View实现随机验证码的相关资料,需要的朋友可以参考下
这篇文章主要介绍了Android通过自定义View实现随机验证码的相关资料,需要的朋友可以参考下
很多的android入门程序猿来说对于android自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。
一、问题描述
熟悉web开发中童鞋们都知道为了防止恶意破解、恶意提交、刷票等我们在提交表单数据时,都会使用随机验证码功能。在android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码view控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个view组件即可。
二、案例介绍
案例运行效果

案例所涉及组件
1、checkview 自定义的验证码控件,主要重写ondraw方法实现图形绘制
2、config:用于对验证码控件参数的配置,像画点点数、划线数、背景颜色的设置
3、checkutil:验证码相关工具类,实现例如随机的点坐标、随机线段起始和结束点坐标、验证码校验等功能
4、mainactivity:测试应用
三、功能实现
1、编写config组件
|
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
83
84
85
86
87
88
89
90
91
92
93
94
|
/*** 功能:用于对验证码控件参数的配置* */public class config {// 验证码更新时间public static final int ptede_time = 1200;// 点数设置public static final int point_num = 100;// 线段数设置public static final int line_num = 2;//设置背景颜色public static final int color=color.blue;//随机数据长度public static int text_length=4;//设置验证码字体大小public static int text_size=30;}2、checkutil组件/*** 功能:验证码相关工具类* */public class checkutil{/*** 产生随机数字* @return*/public static int [] getchecknum(){int [] tempchecknum = new int[config.text_length];for(int i = 0; i < config.text_length; i++){tempchecknum[i] = (int) (math.random() * 10);}return tempchecknum;}/*** 随机产生划线的起始点坐标和结束点坐标* @param height 传入checkview的高度值* @param width 传入checkview的宽度值* @return 起始点坐标和结束点坐标*/public static int[] getline(int height, int width){int [] tempchecknum = {0,0,0,0};for(int i = 0; i < 4; i+=2){tempchecknum[i] = (int) (math.random() * width);tempchecknum[i + 1] = (int) (math.random() * height);}return tempchecknum;}/*** 随机产生点的圆心点坐标* @param height 传入checkview的高度值* @param width 传入checkview的宽度值* @return*/public static int[] getpoint(int height, int width){int [] tempchecknum = {0,0,0,0};tempchecknum[0] = (int) (math.random() * width);tempchecknum[1] = (int) (math.random() * height);return tempchecknum;}/*** 验证是否正确* @param usercheck 用户输入的验证码* @param checknum 验证控件产生的随机数* @return*/public static boolean checknum(string usercheck, int[] checknum){if(usercheck.length() != 4 ){ return false;}string checkstring = "";for (int i = 0; i < 4; i++) {checkstring += checknum[i];}if(usercheck.equals(checkstring)){return true;}else {return false;}}/*** 计算验证码的绘制y点位置* @param height 传入checkview的高度值* @return*/public static int getpositon(int height){int temppositoin = (int) (math.random() * height);if(temppositoin < 20){temppositoin += 20;}return temppositoin;}} |
3、自定义验证码控件checkview
|
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
|
public class checkview extends view{context mcontext;int [] checknum = null;paint mtemppaint = new paint();// 验证码public checkview(context context, attributeset attrs) {super(context, attrs);mcontext = context;mtemppaint.setantialias(true);mtemppaint.settextsize(config.text_size);mtemppaint.setstrokewidth(3);}public void ondraw(canvas canvas){canvas.drawcolor(config.color);final int height = getheight();//获得checkview控件的高度final int width = getwidth();//获得checkview控件的宽度int dx = 40;for(int i = 0; i < 4; i ++){//绘制验证控件上的文本canvas.drawtext("" + checknum[i], dx, checkutil.getpositon(height), mtemppaint);dx += width/ 5;}int [] line;for(int i = 0; i < config.line_num; i ++){//划线line = checkutil.getline(height, width);canvas.drawline(line[0], line[1], line[2], line[3], mtemppaint);}// 绘制小圆点int [] point;for(int i = 0; i < config.point_num; i ++) {//画点point=checkutil.getpoint(height, width);canvas.drawcircle(point[0], point[1], 1, mtemppaint);}}public void setchecknum(int [] chencknum) {//设置验证码checknum = chencknum;}public int[] getchecknum() {//获得验证码return checknum;}public void invalichenknum() {invalidate();}} |
4、编写mainactivity测试代码
|
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
|
public class mainactivity extends activity implements view.onclicklistener{private checkaction mcheckview ;private textview mshowpassviwe;private edittext meditpass;private button msubmit;private button mref;// 验证码:private int [] checknum =null;public void oncreate(bundle savedinstancestate) {super.oncreate(savedinstancestate);setcontentview(r.layout.main); initview();initchecknum();}public void initview(){mcheckview = (checkview) findviewbyid(r.id.checkview);mshowpassviwe = (textview) findviewbyid(r.id.checkpass);meditpass = (edittext) findviewbyid(r.id.checktest);msubmit = (button) findviewbyid(r.id.submit);mref = (button) findviewbyid(r.id.ref);msubmit.setonclicklistener(this);mref.setonclicklistener(this);}// 初始化验证码并且刷新界面public void initchecknum(){checknum = checkutil.getchecknum();mcheckview.setchecknum(checknum);mcheckview.invalichenknum();}public void onclick(view v) {switch (v.getid()){ case r.id.submit:string userinput = meditpass.gettext().tostring();if(checkutil.checknum(userinput, checknum)){setpassstring("通过");toast.maketext(this, "通过", 1200).show();}else{setpassstring("未通过");toast.maketext(this, "未通过", 1200).show();}break;case r.id.ref:initchecknum();break;default:break;}}public void setpassstring(string passstring) {mshowpassviwe.settext(passstring);}} |
以上所述是针对android通过自定义view实现随机验证码的相关知识,希望对大家有所帮助!
发表评论