欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android通过自定义View实现随机验证码

程序员文章站 2024-02-24 10:58:10
很多的android入门程序猿来说对于android自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。...

很多的android入门程序猿来说对于android自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。

一、问题描述

熟悉web开发中童鞋们都知道为了防止恶意破解、恶意提交、刷票等我们在提交表单数据时,都会使用随机验证码功能。在android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码view控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个view组件即可。

二、案例介绍

案例运行效果

Android通过自定义View实现随机验证码

案例所涉及组件

1、checkview 自定义的验证码控件,主要重写ondraw方法实现图形绘制

2、config:用于对验证码控件参数的配置,像画点点数、划线数、背景颜色的设置

3、checkutil:验证码相关工具类,实现例如随机的点坐标、随机线段起始和结束点坐标、验证码校验等功能

4、mainactivity:测试应用

三、功能实现

1、编写config组件

/**
* 功能:用于对验证码控件参数的配置
* */
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

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测试代码

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实现随机验证码的相关知识,希望对大家有所帮助!