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
- Android 简单的验证码效果
- Android实现验证码倒计时简单效果
- php验证码 很简单的效果
- android实践项目一实现简单的验证码和spinner下拉选项效果
- 简单实现短信验证码的倒计时效果
- Android实现验证码效果
- Android 验证码测试效果
- Android---验证码倒计时的简单实现
- Ext中实现 简单验证码效果
- Android中获取验证码时的倒计时效果
- Android中获取验证码时的倒计时效果
- Android中获取验证码时的倒计时效果
- Android实现发送验证码倒计时的效果
- 图片效果的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- android源码解析之(二)-->异步消息机制
- git 添加ssh key
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- openssl 编译
- java FTP 工具类 同步文件夹 下载文件..等操作(FtpHelper 需要commons-net-3.5.jar)
- Android 简单的验证码效果
- SQL Server 中可用的索引类型-温故而知新
- android_判断网络链接状态-ConnectivityManager
- 解决羊生羊问题
- IIS中HTTP Error 503. The service is unavailable
- matlab-自控原理 两个传递函数并联
- 《离散数学及其应用》读书笔记【二】集合 函数 数列 求和
- http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22891521&id=2109284
- 影响到Spark输出RDD分区的操作函数