Android 简单的验证码效果

来源:互联网 发布:网络性能监控软件 编辑:程序博客网 时间:2024/06/07 17:38

类似于网页中的验证码,实现方式非常简单,通过自绘的方式实现,逻辑简单直接看代码:

/** * 生成验证码图片 *  * @author dice *  */public class ValidateImageView extends View {private Paint paint = new Paint();/** * 验证码图片 */private Bitmap bitmap = null;/** * 验证码 用于验证验证码重复时的变量 */private String m_sIdentifyingCode = "";/** * 图片的宽度 */private int width;/** * 图片的高度 */private int height;private ValidateListener validateListener;public void setValidateListener(ValidateListener validateListener) {this.validateListener = validateListener;}public ValidateImageView(Context context, AttributeSet attrs) {super(context, attrs);this.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (validateListener != null) {validateListener.onValidate(getValidataAndSetImage());}}});}public ValidateImageView(Context context) {super(context);this.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (validateListener != null) {validateListener.onValidate(getValidataAndSetImage());}}});}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);width = MeasureSpec.getSize(widthMeasureSpec);height = MeasureSpec.getSize(heightMeasureSpec);}@Overridepublic void draw(Canvas canvas) {// TODO Auto-generated method stubif (bitmap != null) {canvas.drawBitmap(bitmap, 0, 0, paint);} else {paint.setColor(Color.GRAY);paint.setTextSize(20);canvas.drawText("点击换一换", 10, 30, paint);}super.draw(canvas);}/** * 为数组赋值0~9的随机数 *  * @return */private String[] getRandomInteger() {String[] reuestArray = new String[4];Random random = new Random();for (int i = 0; i < 4; i++) {reuestArray[i] = String.valueOf((random.nextInt(10) + i) % 10);}return reuestArray;}/** * 得到验证码;绘制图片 *  * @param strContent *            验证码的字符串数组 * @return */private String getValidataAndSetImage() {// 产生四个随机数String[] strContent = getRandomInteger();// 查重验证,并返回strContent = generateRadom(strContent);// 传随机串和随机数bitmap = generateValidateBitmap(strContent);invalidate();return strContent[0] + strContent[1] + strContent[2] + strContent[3];}private Bitmap generateValidateBitmap(String[] strContent) {if (isBlack(strContent)) {return null;}Bitmap sourceBitmap = Bitmap.createBitmap(width, height,Config.ARGB_8888);Canvas canvas = new Canvas(sourceBitmap);Paint p = new Paint();// 设置字体的大小为我们bitmap的1/2p.setTextSize(height / 2f);// 在xml布局文件中使用android:textStyle=”bold”可以将英文设置成粗体,但是不能将中文设置成粗体,// 将中文设置成粗体的方法是:使用TextPaint的仿“粗体”设置setFakeBoldText为true。p.setFakeBoldText(true);p.setColor(0xFFD0CCC7);canvas.drawRect(0, 0, width, height, p);// (从0-150随机rgb,150一下处于深色状态,防止出现颜色看不清楚)p.setColor(getRandColor(150, 150, 150));// x:默认是这个字符串的左边在屏幕的位置,如果设置了paint.setTextAlign(Paint.Align.CENTER),那就是字符的中心// y:是指定这个字符baseline在屏幕上的位置(就是字符串的底部) 左上角为原点(0,0);// canvas.drawText(text, x, y, p)float tY = height / 2f;canvas.drawText(strContent[0], width / 10, tY, p);Matrix m1 = new Matrix();m1.setRotate(15);canvas.setMatrix(m1);p.setColor(getRandColor(150, 150, 150));canvas.drawText(strContent[1], width * 2 / 5, tY, p);m1.setRotate(10);canvas.setMatrix(m1);p.setColor(getRandColor(150, 150, 150));canvas.drawText(strContent[2], width * 3 / 5, tY - 10, p);m1.setRotate(15);canvas.setMatrix(m1);p.setColor(getRandColor(150, 150, 150));canvas.drawText(strContent[3], width * 4 / 5, tY - 15, p);m1.setRotate(20);canvas.setMatrix(m1);// 障碍设置int startX = 0, startY = 0, stopX = 0, stopY = 0;for (int i = 0; i < 55; i++) {startX = pointRadom(width);startY = pointRadom(height);stopX = pointRadom(15);stopY = pointRadom(15);p.setColor(getRandColor(200, 230, 220));canvas.drawLine(startX, startY - 20, startX + stopX, startY + stopY- 20, p);}canvas.save();return sourceBitmap;}/** * 检测产生的验证码是否为空 *  * @param strContent * @return */private boolean isBlack(String[] strContent) {if (strContent == null || strContent.length <= 0) {return true;} else {return false;}}/** * 从指定数组中随机取出4个字符(数组) *  * @param strContent * @return */private String[] generateRadom(String[] strContent) {m_sIdentifyingCode = "";// 每次验证前重置改验证码// 生成4个随机数String[] str = new String[4];int count = 9;Random random = new Random();int randomResFirst = checkRadom(random.nextInt(count), count);int randomResSecond = checkRadom(random.nextInt(count), count);int randomResThird = checkRadom(random.nextInt(count), count);int randomResFourth = checkRadom(random.nextInt(count), count);str[0] = randomResFirst + "";str[1] = randomResSecond + "";str[2] = randomResThird + "";str[3] = randomResFourth + "";return str;}/** * 检测验证码是否重复 如果一样的话重新生成新的 直到不重复为止 *  * @param nValue *            新的验证码 * @param nCount * @return */private int checkRadom(int nValue, int nCount) {Random random = new Random();boolean bVlaue = true;while (bVlaue) {if (m_sIdentifyingCode.contains(nValue + ""))nValue = random.nextInt(nCount);elsebVlaue = false;}m_sIdentifyingCode += nValue;return nValue;}private int pointRadom(int n) {Random r = new Random();return r.nextInt(n);}/** * 给定范围获得随机颜色 *  * @param rc *            0-255 * @param gc *            0-255 * @param bc *            0-255 * @return colorValue 颜色值,使用setColor(colorValue) */private int getRandColor(int rc, int gc, int bc) {Random random = new Random();if (rc > 255)rc = 255;if (gc > 255)gc = 255;if (bc > 255)bc = 255;int r = random.nextInt(rc);int g = random.nextInt(gc);int b = random.nextInt(bc);return Color.rgb(r, g, b);}public interface ValidateListener {/** * 点击产生随机数的时候调用 *  * @param validate */public void onValidate(String validate);}}
使用方法:

1.xml文件

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin">     <com.dice.text.ValidateImageView        android:id="@+id/validateImageView"        android:layout_width="60dp"        android:layout_height="40dp"        android:layout_alignParentLeft="true"        android:layout_marginTop="16dp" /></RelativeLayout>
2.MainActivity中:

im = (ValidateImageView) findViewById(R.id.validateImageView);im.setValidateListener(new ValidateListener() {@Overridepublic void onValidate(String validateString) {Toast.makeText(MainActivity.this, validateString, Toast.LENGTH_SHORT).show();}});
效果如图:


剩下的细节大家可以自己改动一下








1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩手游手机太卡怎么办 苹果七发烫厉害怎么办 苹果手机延迟高怎么办 王者荣耀总是卡怎么办 王者荣耀卡屏怎么办 王者荣耀网络延迟怎么办 荣耀8手机卡了怎么办 荣耀v10有点卡怎么办 荣耀10有点卡怎么办 8g内存吃鸡会崩怎么办 玩看门狗很卡怎么办 拼多多人数不够怎么办 玩cf想吐怎么办 玩手机头晕恶心怎么办 玩手机头疼恶心怎么办 看手机想吐怎么办 英雄联盟取名后怎么办 王者荣耀改名重复怎么办 刺激战场改名重复怎么办 省钱快报忘记密码怎么办 手机直播网速卡怎么办 触手tv直播黑屏怎么办 酷狗id密码忘记怎么办 打游戏网络不稳定怎么办 电脑打字法没了怎么办 家庭版密钥专业版系统怎么办 win7应用程序不能启动怎么办 win7用户密码忘记了怎么办 win7用户密码忘了怎么办 windows开不了机怎么办 网卡被卸载了怎么办 win7注销黑屏了怎么办 w7密码忘了怎么办 笔记本电脑键盘进水了怎么办 笔记本键盘进水了怎么办 笔记本进水键盘失灵怎么办 win7进不了系统怎么办 电脑显示屏两边黑屏怎么办 win8关机关不了怎么办 win10没激活黑屏怎么办 忘了产品密钥怎么办