Android通过自定义View实现随机验证码
程序员文章站
2024-03-31 13:54:58
很多的android入门程序猿来说对于android自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。...
很多的android入门程序猿来说对于android自定义view,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义view上面花一些功夫,多写一些文章。
一、问题描述
熟悉web开发中童鞋们都知道为了防止恶意破解、恶意提交、刷票等我们在提交表单数据时,都会使用随机验证码功能。在android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码view控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个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实现随机验证码的相关知识,希望对大家有所帮助!
上一篇: java根据url抓取并生成缩略图的示例
下一篇: 用CSS给图片打标的代码