Android图形验证码

1. 前言

图形验证码可以让服务器以图片的形式传给客户端,也可以让客户端自己实现。那客户端要怎么做呢?其实很简单,可以使用Android的Canvas、Paint和Random来实现。用Random来随机生成数字、字母、颜色、画笔原点等等,设置Paint的颜色和样式,然后再Canvas上面绘制,这样一个图形验证码就生成好了。

2. 具体实现

根据上面所说的,我们可以封装一个工具类来使用,详细功能有:

  • 自定义验证码类型:数字、字母、数字字母组合
  • 自定义验证码大小
  • 自定义验证码背景颜色
  • 自定义干扰线数量
  • 自定义字体大小、数量、间距

具体代码如下:

package com.fantasy.blogdemo.captcha;import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;import java.util.Random;/*** 图形验证码工具* <pre>*     author  : Fantasy*     version : 1.0, 2019-06-27*     since   : 1.0, 2019-06-27* </pre>*/
public class Captcha {private static final char[] CHARS_NUMBER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};private static final char[] CHARS_LETTER = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j','k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w','x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Y', 'Z'};private static final char[] CHARS_ALL = {'0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j','k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w','x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Y', 'Z'};/*** 验证码图片的宽度*/private int mWidth;/*** 验证码图片的高度*/private int mHeight;private int mBackgroundColor;/*** 验证码的长度*/private int mLength;/*** 干扰线的数量*/private int mLineNumber;private int mFontSize;/*** 字体左边距*/private int mFontPaddingLeft;/*** 字体左边距范围值*/private int mFontPaddingLeftRang;/*** 字体上边距*/private int mFontPaddingTop;/*** 字体上边距范围值*/private int mFontPaddingTopRang;private TYPE mType;private Random mRandom;private static Captcha mInstance;/*** 生成的验证码*/private String mCode;public enum TYPE {NUMBER, LETTER, CHARS}private Captcha() {mType = TYPE.CHARS;mWidth = 200;mHeight = 80;mBackgroundColor = Color.WHITE;mLength = 4;mLineNumber = 2;mFontSize = 50;mFontPaddingLeft = 20;mFontPaddingLeftRang = 20;mFontPaddingTop = 45;mFontPaddingTopRang = 15;mRandom = new Random();}public static Captcha getInstance() {if (mInstance == null) {synchronized (Captcha.class) {mInstance = new Captcha();}}return mInstance;}/*** 设置验证码类型,有:数字、英文字母、数字加英文字母** @param type 类型* @return CaptchaUtils实例*/public Captcha setType(TYPE type) {mType = type;return mInstance;}/*** 设置验证码图片大小** @param width  宽度* @param height 高度* @return CaptchaUtils实例*/public Captcha setSize(int width, int height) {mWidth = width;mHeight = height;return mInstance;}/*** 设置背景颜色** @param color 颜色* @return CaptchaUtils实例*/public Captcha setBackgroundColor(int color) {mBackgroundColor = color;return mInstance;}/*** 设置验证码的长度** @param length 长度* @return CaptchaUtils实例*/public Captcha setLength(int length) {mLength = length;return mInstance;}/*** 设置干扰性数量** @param number 数量* @return CaptchaUtils实例*/public Captcha setLineNumber(int number) {mLineNumber = number;return mInstance;}/*** 设置字体大小** @param size 字体大小* @return CaptchaUtils实例*/public Captcha setFontSize(int size) {mFontSize = size;return mInstance;}/*** 设置字体间距** @param paddingLeft 左边距* @param paddingTop  上边距* @return CaptchaUtils实例*/public Captcha setFontPadding(int paddingLeft, int paddingTop) {mFontPaddingLeft = paddingLeft;mFontPaddingTop = paddingTop;return mInstance;}/*** 设置字体间距** @param paddingLeft     左边距* @param paddingLeftRang 左边距范围值* @param paddingTop      上边距* @param paddingTopRang  上边距范围值* @return CaptchaUtils实例*/public Captcha setFontPadding(int paddingLeft, int paddingLeftRang, int paddingTop,int paddingTopRang) {mFontPaddingLeft = paddingLeft;mFontPaddingLeftRang = paddingLeftRang;mFontPaddingTop = paddingTop;mFontPaddingTopRang = paddingTopRang;return mInstance;}/*** 获取生成的图形验证码** @return 图形验证码的字符串*/public String getCode() {return mCode;}/*** 生成图形验证码** @return 图形验证码的图片*/public Bitmap create() {mCode = createCode();Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);canvas.drawColor(mBackgroundColor);Paint paint = new Paint();paint.setTextSize(mFontSize);int fontPaddingLeft = 0;for (int i = 0; i < mCode.length(); i++) {getRandomTextStyle(paint);fontPaddingLeft += getRandomFontPaddingLeft();canvas.drawText(String.valueOf(mCode.charAt(i)), fontPaddingLeft, getRandomFontPaddingTop(), paint);}for (int i = 0; i < mLineNumber; i++) {drawLine(canvas, paint);}canvas.save();canvas.restore();return bitmap;}/*** 生成图形验证码** @return 图形验证码的字符串*/private String createCode() {StringBuilder buffer = new StringBuilder();switch (mType) {case NUMBER:for (int i = 0; i < mLength; i++) {buffer.append(CHARS_NUMBER[mRandom.nextInt(CHARS_NUMBER.length)]);}break;case LETTER:for (int i = 0; i < mLength; i++) {buffer.append(CHARS_LETTER[mRandom.nextInt(CHARS_LETTER.length)]);}break;case CHARS:for (int i = 0; i < mLength; i++) {buffer.append(CHARS_ALL[mRandom.nextInt(CHARS_ALL.length)]);}break;default:for (int i = 0; i < mLength; i++) {buffer.append(CHARS_ALL[mRandom.nextInt(CHARS_ALL.length)]);}break;}return buffer.toString();}/*** 获取随机颜色** @return 颜色*/private int getRandomColor() {int red = mRandom.nextInt(256);int green = mRandom.nextInt(256);int blue = mRandom.nextInt(256);return Color.rgb(red, green, blue);}/*** 获取随机文本样式** @param paint 涂料*/private void getRandomTextStyle(Paint paint) {int color = getRandomColor();paint.setColor(color);paint.setFakeBoldText(mRandom.nextBoolean()); // true为粗体,false为非粗体int skewX = mRandom.nextInt(11) / 10;skewX = mRandom.nextBoolean() ? skewX : -skewX;paint.setTextSkewX(skewX); // 负数表示右斜,整数左斜// paint.setUnderlineText(true); // true为下划线,false为非下划线// paint.setStrikeThruText(true); // true为删除线,false为非删除线}/*** 获取随机字体左边距** @return 左边距*/private int getRandomFontPaddingLeft() {return mFontPaddingLeft + mRandom.nextInt(mFontPaddingLeftRang);}/*** 获取随机字体上边距** @return 上边距*/private int getRandomFontPaddingTop() {return mFontPaddingTop + mRandom.nextInt(mFontPaddingTopRang);}/*** 生成干扰性** @param canvas 画布* @param paint  涂料*/private void drawLine(Canvas canvas, Paint paint) {int color = getRandomColor();int startX = mRandom.nextInt(mWidth);int startY = mRandom.nextInt(mHeight);int stopX = mRandom.nextInt(mWidth);int stopY = mRandom.nextInt(mHeight);paint.setStrokeWidth(1);paint.setColor(color);canvas.drawLine(startX, startY, stopX, stopY, paint);}}

3. 使用方式

获取实例并设置

mCaptcha = Captcha.getInstance().setType(Captcha.TYPE.CHARS).setSize(200, 80).setBackgroundColor(Color.WHITE).setLength(4).setLineNumber(2).setFontSize(50).setFontPadding(20, 20, 45, 15);

生成图形验证码,并且在ImageView中显示

mIvCaptcha.setImageBitmap(mCaptcha.create());

获取验证码的字符串,可用于比对输入是否正确

if (result.equals(mCaptcha.getCode())) {showToast(R.string.captcha_correct);
} else {showToast(R.string.captcha_wrong);
}

4. 效果图

想看完整代码可以到我的GitHub上面看看BlogDemo。

 

如果想进一步交流和学习的同学,可以加一下QQ群哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253867.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java生成图形验证码

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) 首先&#xff0c;需要生成验证码字符串&#xff0c;方式很多&#xff0c;下面提供一种&#xff0c;根据指定源的方式来生成验证码 /*** 使用系统默认字符源生成验…

图形验证码最佳攻略2

下面是注册 如果是手机用户注册,需要发送短信验证码 说明: 发送图形验证码是为了拦截发送短信的.但是不拦截"注册帐号" 但是,用户体验很别扭,因为图形验证码很显然是错误的,但是却可以注册成功. 如果点击注册帐号 ,也要校验图形验证码,那就让用户输入两次图形验证码,…

小程序图形验证码输入校验例子

前言 本教程是基于 “apifm-wxapi” 模块&#xff0c;教你快速实现小程序开发&#xff0c;所以你可能需要先了解以下知识点&#xff1a; 《创建 HelloWorld 项目》《使用 “apifm-wxapi” 快速开发小程序》《免费注册开通后台&#xff0c;获得专属域名》 功能说明 图形验证码的…

Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

Part1&#xff1a;使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习 1. 效果图2. 原理2.0 前向成像模型2.1 世界坐标系2.2 相机坐标系2.3 坐标变换2.4 投影转换2.5 数据 3. 源码参考 是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景&#xff1f; 有…

IDEA+Mysql+Sqlserver安装步骤_kaic

下载Intellij 开发工具&#xff0c;如果有请检查软件是否过期&#xff0c;如果过期卸载电脑上的Intellij软件。卸载步骤&#xff1a; 打开控制面板&#xff0c;选择卸载程序找到Intellij右键卸载 如果没有请保存文档中的Intellij.zip压缩包,进行安装&#xff0c;安装步骤 双…

电脑重置网络

1、键盘WinR键&#xff0c;弹出窗口 2、然后在里面输入cmd输入CMD 3、出现的命令提示框内输入“netsh winsock reset"按”Enter“键 4、重启电脑后生效。

重置电脑

步骤1&#xff1a; 以Win10系统为例 直接在搜索框输入:reset 或者直接选择「设置」-「更新和安全」-「恢复」 步骤2&#xff1a; 步骤3&#xff1a; 根据个人情况选择【保留我的文件】或者【删除所有内容】

如何让Win10 重置此电脑功能无法使用

环境&#xff1a; Win10 专业版 问题描述&#xff1a; 通过设置-更新和安全-恢复-重置此电脑&#xff0c;如何让Win10 重置此电脑功能无法使用 解决方案&#xff1a; 1.PE下删除Win Re 恢复分区&#xff0c;然后重置就无法使用

重置计算机后无法开机,win10重置此电脑失败怎么办_win10重置此电脑失败无法开机修复方法...

当win10系统使用时间长了&#xff0c;难免会有一些电脑故障的出现&#xff0c;这时有些用户就会选择使用重置电脑的方式来解决&#xff0c;但是最近有用户再给自己的win10系统进行重置时总是出现失败的情况&#xff0c;那么win10重置此电脑失败怎么办呢&#xff1f;下面就来告诉…

win10怎么重置计算机,如何重置Win10系统电脑

当系统出现一些难以解决的问题时&#xff0c;我们一般会选择重置电脑来解决问题&#xff0c;比起重装电脑来说简单很多&#xff0c;但是也要注意有可能会失败。下面小编就以win10为例&#xff0c;给大家讲讲怎么重置电脑的操作步骤吧。 操作步骤&#xff1a; 1、打开屏幕侧方的…

DELL 笔记本 - Windows 10 恢复 / 重置此电脑

DELL 笔记本 - Windows 10 恢复 / 重置此电脑 1. Windows 设置 2. 更新和安全 3. 恢复 4. 删除所有内容 5. 所有驱动器 6. 仅删除我的文件 7. 重置 References https://yongqiang.blog.csdn.net/

win10系统如何重置电脑

在win10系统出现系统问题无法修复的时候&#xff0c;我们可以尝试使用win10系统自带的重置功能&#xff0c;相比重装系统在操作上可能要简单不少&#xff0c;不过同样也有失败的风险。下面就让小编带领大家进行一下win10系统重置电脑的操作吧。 win10系统如何重置电脑 1、打…

win10怎样重置电脑

win10怎样重置电脑 windows10提供重置电脑的功能&#xff0c;如果系统遇到问题&#xff0c;运行不正常&#xff0c;或者想刷新系统&#xff0c;可以考虑重置电脑&#xff0c;使电脑有一个全新的干净的系统。下面介绍重置的方法 点击开始菜单&#xff0c;然后选择“设置” 在设…

【教程】Win10重置电脑和重装系统

如果电脑系统出现蓝屏或者卡顿的故障&#xff0c;很多用户会想要通过重装系统来解决。 其实在Windows10系统中会有“重置此电脑”的功能&#xff0c;类似于恢复出厂设置的意思。很多时候只需要重置电脑就足够解决用户的需求了&#xff0c;duck不必繁琐的制作启动U盘来重装系统…

计算机系统如何重置,如何重置电脑系统?看这里1分钟教会你!

原标题&#xff1a;如何重置电脑系统&#xff1f;看这里1分钟教会你&#xff01; 哈喽&#xff0c;大家好我是小黑~最近后台有小伙伴留言咨询#如何重置Windows 10系统&#xff1f;#。 重置系统是Windows系统自带的功能&#xff0c;此功能会将错误的系统文件替换&#xff0c;从而…

Win10笔记本电脑怎么直接重置初始化

很多朋友都知道电子设备一般都会有初始化的功能&#xff0c;自己使用的电脑毛病越来越多&#xff0c;不知道能不能重置初始化&#xff0c;今天我给朋友们讲讲Win10笔记本电脑怎么直接重置初始化让电脑系统焕然一新&#xff0c;大家可以按下面的步骤操作。 Win10笔记本电脑怎么直…

重装也无法修复此计算机,win10系统重置此电脑失败怎么解决

win10系统重置失败怎么办呢?有时候因为电脑各种各样的问题我们需要进行重置系统,可是有些粗心的朋友忘记给笔记本充电了。造成win10系统重置失败的情况。下面,我就给大家介绍一下win10系统重置失败的解决方法 win10系统是微软安全性最高的一款版本,其游戏性能以及易用性也深…

如何给电脑系统重置系统?方法其实很简单

Win11怎么一键重置&#xff1f;很多朋友感觉电脑系统遇到比较大的问题&#xff0c;必须要进行重置&#xff0c;但就是不知道如何操作&#xff0c;今天小编带来了Win11一键重置电脑的操作步骤&#xff0c;一种方法是在电脑还能进入桌面的时候进行操作&#xff0c;另一种则是电脑…

计算机的此电脑管理出错了,win10重置此电脑出现问题怎么处理_win10重置初始化失败解决方法...

重置此电脑是什么意思呢&#xff1f;总的来说&#xff0c;就是对电脑进行恢复出厂设置&#xff0c;一般只是恢复得到初始的状况&#xff0c;但是近日有用户在给自己的win10系统进行重置此电脑操作时出现问题&#xff0c;导致初始化失败&#xff0c;那么win10重置此电脑出现问题…

电脑重置可能出现的问题及解决办法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、重置电脑后发现没有以太网二、以太网出现后但是发现网络无法识别总结 前言 重置电脑后发现WIFI可以用但是没有以太网&#xff0c;连接不上。 提示&#xf…