Android生成验证码

先放上这个小Demo的图片:点击图片可以更换新的验证码。

验证码是以图片的形式显示的,所以需要写一个自定义验证码控件

public class ValidateView extends View {

	/**
	 * 点数
	 */
	private int pointNum = 150;// 背景杂质
	/**
	 * 线段数
	 */
	private int lineNum = 3;// 背景杂质
	/**
	 * 验证码字长
	 */
	private int validateCodeLenght = 6;// 默认长度为6
	/**
	 * 验证码
	 */
	private String[] validateCode;
	private Paint mTempPaint = new Paint();
	private Context mContext;

	/**
	 * 验证码内容
	 */
	private static final String[] strContent = new String[] { "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" };

	public ValidateView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		mTempPaint.setAntiAlias(true);
		mTempPaint.setTextSize(50);
		mTempPaint.setStrokeWidth(3);
		validateCode = new String[validateCodeLenght];// 验证码
	}

	public String[] getValidateCode() {
		return validateCode;
	}

	public void setValidateCode(String[] validateCode) {
		this.validateCode = validateCode;
	}

	public void onDraw(Canvas canvas) {
		canvas.drawColor(Color.GREEN);

		// 绘制验证码
		final int height = getHeight();
		final int width = getWidth();
		int dx = 30;

		for (int i = 0; i < validateCodeLenght; i++) {
			canvas.drawText("" + validateCode[i], dx, getPositon(height), mTempPaint);
			dx += width / (validateCodeLenght + 1);
		}
		int[] line;

		for (int i = 0; i < lineNum; i++) {
			line = getLine(height, width);
			canvas.drawLine(line[0], line[1], line[2], line[3], mTempPaint);
		}
		// 绘制小圆点
		int[] point;
		for (int i = 0; i < pointNum; i++) {
			point = getPoint(height, width);
			canvas.drawCircle(point[0], point[1], 1, mTempPaint);
		}
	}

	/**
	 * 更新验证码显示
	 */
	public void invaliChenkNum() {
		invalidate();
	}

	/**
	 * 生成验证码,并显示在图片上
	 *
	 * @return
	 */
	public String[] createAndSetValidateCode() {
		String[] tempValidateCode = new String[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i++) {
			tempValidateCode[i] = strContent[(int) (Math.random() * strContent.length)];
		}
		validateCode = tempValidateCode;
		return tempValidateCode;
	}

	/**
	 * 生成验证码
	 *
	 * @return
	 */
	public String[] createCheckNum() {
		String[] tempCheckNum = new String[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i++) {
			tempCheckNum[i] = strContent[(int) (Math.random() * strContent.length)];
		}
		return tempCheckNum;
	}

	private int[] getLine(int height, int width) {
		int[] tempCheckNum = new int[validateCodeLenght];
		for (int i = 0; i < validateCodeLenght; i += 2) {
			tempCheckNum[i] = (int) (Math.random() * width);
			tempCheckNum[i + 1] = (int) (Math.random() * height);
		}
		return tempCheckNum;
	}

	private int[] getPoint(int height, int width) {
		int[] tempCheckNum = new int[validateCodeLenght];
		tempCheckNum[0] = (int) (Math.random() * width);
		tempCheckNum[1] = (int) (Math.random() * height);
		return tempCheckNum;
	}

	/**
	 * 验证是否正确,单元测试通过
	 *
	 * @param userCheck
	 *            用户输入的验证码
	 * @param ValidateCode
	 *            自动生成的验证码
	 * @return
	 */
	public boolean validateCode(String userCheck, String[] code) {
		if (userCheck.length() != validateCodeLenght) {
			return false;
		}
		String checkString = "";
		for (int i = 0; i < validateCodeLenght; i++) {
			checkString += code[i];
		}
		if (userCheck.equals(checkString)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获取验证码的纵坐标
	 *
	 * @param height
	 * @return
	 */
	public int getPositon(int height) {
		int tempPositoin = (int) (Math.random() * height);
		if (tempPositoin < 25) {
			tempPositoin += 25;
		}
		return tempPositoin;
	}

	public int getPointNum() {
		return pointNum;
	}

	public void setPointNum(int pointNum) {
		this.pointNum = pointNum;
	}

	public int getLineNum() {
		return lineNum;
	}

	public void setLineNum(int lineNum) {
		this.lineNum = lineNum;
	}

	public int getValidateCodeLenght() {
		return validateCodeLenght;
	}

	public void setValidateCodeLenght(int validateCodeLenght) {
		this.validateCodeLenght = validateCodeLenght;
		validateCode = new String[validateCodeLenght];// 验证码
	}

}

简单的XML布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <com.example.validateviewdemo.ValidateView
        android:id="@+id/validateView"
        android:layout_width="180dp"
        android:layout_height="50dp" />

</LinearLayout>

实现简单的功能:

public class MainActivity extends Activity {

	ValidateView validateView;
	private static final int LENGHT = 6;//验证码的长度
	private String[] code = new String[LENGHT];//验证码

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		validateView = (ValidateView) findViewById(R.id.validateView);
		validateView.setValidateCodeLenght(LENGHT);
		code = validateView.createAndSetValidateCode();
		validateView.setOnClickListener(new OnClickListener() {
			// 点击图片,更换验证码
			@Override
			public void onClick(View arg0) {
				code = validateView.createAndSetValidateCode();
				validateView.invalidate();
			}
		});
	}
}

一般使用方式都是获取自动生成的验证码,再从输入框获取用户输入的验证码,相互比对就可以得出结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 02:05:43

Android生成验证码的相关文章

android 生成验证码图片

(转自:http://blog.csdn.net/onlyonecoder/article/details/8231373) 1 package com.nobeg.util; 2 3 import java.util.Random; 4 5 import android.graphics.Bitmap; 6 import android.graphics.Canvas; 7 import android.graphics.Color; 8 import android.graphics.Pai

android生成验证码bitmap

不多说了,直接上代码,项目中用到的,未做优化,还有很多参数未设置. [java] view plaincopy 1.import java.util.Random; 2. 3.import android.graphics.Bitmap; 4.import android.graphics.Canvas; 5.import android.graphics.Color; 6.import android.graphics.Paint; 7.import android.graphics.Bitm

Android本地验证码的生成

android客户端生成本地验证码主要用来限制用户随意按请求按钮,其实该示例也是来对自定义view的练练手而已,先给出效果图吧 其中可定制: *干扰线数目 *干扰点数目 *背景颜色 *验证码字体大小及字数 相信以上可以满足一般的需要了吧,不够的话可自行添加,下面就来讲实现的步骤了 继承view,重写构造方法,并初始化所需参数 public class ValidationCode extends View { private Paint mTextPaint;//文字画笔 private Pai

Android锁定EditText内容和随机生成验证码

昨天写了个小Demo,实现了随机生成验证码,和锁定EditText两个小功能,先看一下效果图: 锁定EditText在我们不需要用户编辑EditText内容的时候可以用到,实现还是很简单的,一行代码: etLock.setEnabled(false); 随机生成验证码,主要是用了Random函数,以及将View转为Bitmap的逻辑,也没有难点,下面贴一下代码,供需要的朋友参考: Main.java package com.zms.textlock; import android.graphic

生成验证码总结

java生成验证码总结 1.serialVersionUID    private static final long serialVersionUID = -8501285780349046114L;    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.相当于java类的身份证.主要用于版本控制. 2.BufferedImage类    --BufferedImage 子类描述具有可访问图像数据缓冲区的 Image.    TYPE_INT_RG

php图形图像处理之生成验证码

\(^o^)/~ 现在网上越来越离不开验证码了,不知道小伙伴们知不知利用php的GD库就可以生成验证码,Σ(⊙▽⊙"a ...... 首先介绍几个需要用的函数. 1.imagesetpixel() 这个函数可以进行像素点的绘制,在验证码中,我们称之为“噪点”,简直是一个神器.不知道小伙伴有没有想起来验证码上的点点呢,就是用这个函数生成的. 2.str_shuffle() 利用这个打乱字符串,然后利用substr()截取给定的位数,就可以生成一个随机字符串啦. 实例: 1 <?php 2 3

PHP 动态生成验证码

……机器人会在网站中搜寻允许他们插入广告的输入表单,在虚拟世界没有什么能阻挡它们胡作非为.这些机器人效率极高,完全不关心所攻击的表单的本来用途.它们唯一的目标就是用它们的垃圾广告覆盖你的内容,残忍地为它们的主人谋取广告收入. 要检验一个表单所面对的是一个真正的人,这种测试称为CAPTCHA(完全自动化公共图灵测试).目前最有效的方法是生成一个要求用户输入的随机通行短语,为了防止支持OCR(光学字符识别)的机器人破解系统,通行短语字母必须变形,或者用随机的直线和点进行部分模糊处理. /* 生成验证

javaweb学习总结(九)—— 通过Servlet生成验证码图片

一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.response.study; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5 import java.awt.Graphics2D; 6 import java.awt.image.Buff

生成验证码效果

生成验证码效果    ValidateCode.java 验证码生成类 Java代码   package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; impor