一般在前端或者移动端生成一个图形验证码需要创建一个图片,现在大多数都由后台生成,调用接口得到返回的图片url直接放上去,再把用户输入的验证码提交给后台,由后台判断验证码是否正确。如果仅仅为了防止用户频繁操作,本地生成一个就行,我这里就讲一个简单的模拟生成,不包含汉字的。
首先考虑目的,一个图片(可以是drawable,可以是bitmap),一个验证码code(一个字符串),那就先生成随机的验证码code,生成code的方式很多,可以用java的正则表达式,也可以自定义,我这里就讲一个自定义的:创建一个char数组,从中取4个或者6个出来随机排列,代码如下——
到这里验证码就生成出来了,由createCode()方法即可得到,codeLength为验证码的长度,可以自行设置。
然后就是考虑图片了,首先设置好图片的宽高,比如宽110dp,高48dp,那么创建的bitmap就是 val bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888),得到bitmap之后创建它的画布,在画布上需要把验证码以不规则的排列画上去,所以给每个字符随机的padding,但是又不能超出范围,所以就小范围内随机:
我这里定的值是10和15,其实可以自己计算一下,字体的大小,以及画布的宽高,就可以定出范围了。在画每个验证码字符的时候随机一下颜色,是否加粗,倾斜度等:
之前我考虑的是给每个字符加干扰线(下划线和删除线),后面优化了一下,在画布上直接画整体的干扰线:
至于画多少条也由自己定,再给画布一个背景c.drawColor(Color.parseColor("#cfeef5")),至此一个简易的图形验证码就生成完毕了。在调用的时候把生成的bitmap设置给ImageView,利用生成的code和用户输入的内容作比较,如果是要忽略大小写,那就全都转成小写或者大写来比较即可。
有没有需要完整代码的呢?