在登录或者注册时,客户端总有一个验证码需要用户填写,自己在网上搜索了一些资料,便自己做了出来。

1,写一个验证码生成的类

public class Code {
//随机数数组
    private static final char[] CHARS = {
'2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
            'n', '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', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    };

    private static Code bmpCode;

    public static Code getInstance() {
if(bmpCode == null)
bmpCode = new Code();
        return bmpCode;
    }
//default settings
    //验证码默认随机数的个数
    private static final int DEFAULT_CODE_LENGTH = 4;
    //默认字体大小
    private static final int DEFAULT_FONT_SIZE = 25;
    //默认线条的条数
    private static final int DEFAULT_LINE_NUMBER = 5;
    //padding值
    private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;
    //验证码的默认宽高
    private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40;

    //settings decided by the layout xml
    //canvas width and height
    private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;

    //random word space and pading_top
    private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
            base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;

    //number of chars, lines; font size
    private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;

    //variables
    private String code="";
    private int padding_left, padding_top;
    private Random random = new Random();
    //验证码图片
    public Bitmap createBitmap(String code) {
padding_left = 0;

        Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888);
        Canvas c = new Canvas(bp);

        //验证码从服务器获取,而不是自己生成
//        code = createCode();
        this.code=code;
        c.drawColor(Color.WHITE);
        //如果没有传入字符,则只绘制背景
        if (code.equals("")){
}else {
Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setTextSize(font_size);
            //画验证码
            for (int i = 0; i < code.length(); i++) {
randomTextStyle(paint);
                randomPadding();
                c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
            }
//画线条
            for (int i = 0; i < line_number; i++) {
drawLine(c, paint);
            }
}
c.save( Canvas.ALL_SAVE_FLAG );//保存
        c.restore();//
        return bp;
    }
public String getCode() {
return code;
    }
//生成验证码
    private String createCode() {
StringBuilder buffer = new StringBuilder();
        for (int i = 0; i < codeLength; i++) {
buffer.append(CHARS[random.nextInt(CHARS.length)]);
        }
return buffer.toString();
    }
//画干扰线
    private void drawLine(Canvas canvas, Paint paint) {
int color = randomColor();
        int startX = random.nextInt(width);
        int startY = random.nextInt(height);
        int stopX = random.nextInt(width);
        int stopY = random.nextInt(height);
        paint.setStrokeWidth(1);
        paint.setColor(color);
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }
//生成随机颜色
    private int randomColor() {
return randomColor(1);
    }
private int randomColor(int rate) {
int red = random.nextInt(256) / rate;
        int green = random.nextInt(256) / rate;
        int blue = random.nextInt(256) / rate;
        return Color.rgb(red, green, blue);
    }
//随机生成文字样式,颜色,粗细,倾斜度
    private void randomTextStyle(Paint paint) {
int color = randomColor();
        paint.setColor(color);
        paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体
        float skewX = random.nextInt(11) / 10;
        skewX = random.nextBoolean() ? skewX : -skewX;
        paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
        //paint.setUnderlineText(true); //true为下划线,false为非下划线
        //paint.setStrikeThruText(true); //true为删除线,false为非删除线
    }
//随机生成padding值
    private void randomPadding() {
padding_left += base_padding_left + random.nextInt(range_padding_left);
        padding_top = base_padding_top + random.nextInt(range_padding_top);
    }
}

其中,createBitmap(String code)是通过传入字符串验证码,字符串自己可以随便写一个函数生成,或者用code类的createCode()生成随机数,然后drawLine()是随机在图像上绘制多条横线。

在activity随时调用就可以了,然后设置imageview的背景iv_showCode.setImageBitmap(Code.getInstance().createBitmap("随机数"));

就这么简单。

android 验证码相关推荐

  1. android 首字母 验证码,Android 验证码功能实现代码

    先给大家展示下效果图,如果大家感觉还不错,请参考实现代码 很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界面中,这里只是实现了跳转,并没有进 ...

  2. Android验证码倒计时实现方式总结

    Android验证码倒计时实现方式总结 几乎所有的APP里面都有验证码倒计时按钮,自己在项目中也尝试,简单总结为以下三种: 1.使用线程和Handler的方式,定时刷新倒计时数字,这种方式容易导致内存 ...

  3. Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等

    MNPasswordEditText 项目地址:maning0303/MNPasswordEditText  简介: Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框 ...

  4. Android 验证码输入框的实现

    上篇博客讲到登录注册的流程所需用到的带显示密码的输入框,而在整个完整流程中,短信发送获取验证码并填写相信也是重要的一环.当然,关于验证码的实现很多大神的博客也写过,并且款式多样,任君选择,这里只是记录 ...

  5. android 验证码之短信验证(云之讯短信平台)

    好久没更新过博客了.这段时间总算是忙完了,抽点时间出来更新下博客.这次跟大家带来的是一个很简单的短信验证码.相信这个验证码的功能基本上99的项目都需要用到,我这里是用的云之迅平台,为什么要用这个平台, ...

  6. android 验证码按钮点击,判断网络和匹配手机号并自动更新时间;

    开发过程中会遇见很多app注册时需要通过手机发送验证码验证,并获取验证码进行验证,在发送验证码时会有个手机号判断和网络链接及按钮上的数字自动递减:为后续用起来方便,特地做个记录: 在布局之前先要做的是 ...

  7. Android验证码输入框支持粘贴

    验证码输入框,满足剪切板内容自动填充,看效果 原本做法是6个EditText,后来发现,这样写最大问题是,无法满足粘贴功能,验证码短信 一般都带"复制",点击 短信通知栏 的&qu ...

  8. android 验证码图片识别_图片验证码的识别技术

    这里有最简单的一类验证码:他们有固定的背景颜色,相同的字符颜色和字体,字符的坐标位置也是固定的. 对于这类验证码,我们只需要对每个数字进行采样,建立标准库,然后应用的时候一一对照标准库,就可以轻易做到 ...

  9. android 验证码短信验证码,Android​短信验证码倒计时验证的2种常用方式

    前言 ​本文主要介绍的是短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用. 看图 计时器 说明:这里的及时从10开始,是为了演示的时间不要等太长而修改的. 方法如下 1.第一种方式:Time ...

最新文章

  1. R语言SVM支持向量机模型数据分类实战:探索性数据分析、模型调优、特征选择、核函数选择
  2. 2015内蒙古计算机考试成绩,2015年新疆公务员考试笔试成绩计算机加分说明
  3. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
  4. MFC全局函数开局——AfxGetApp解剖
  5. linux启动docker_10分钟快速掌握Docker必备基础知识
  6. JavaScript学习笔记:你必须要懂的原生JS(一)
  7. Vector的简单使用
  8. 批量导入数据到mssql数据库的
  9. 如何查看Laravel版本号的三种方法
  10. opencv图像分析与处理(15)- 图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现
  11. jsp进阶教程和Servlet
  12. 【SPSS统计分析】SPSS19.0简体中文版安装教程(附SPSS19.0简体中文版下载)
  13. Python 数据正态性检验
  14. 计算机专业成功的普通人案例,普通人努力追梦的例子_平凡人的真实励志故事...
  15. C语言,快速隐藏/显示桌面图标和任务栏
  16. 教你一招恢复100分信用分,新手违规被扣40分,还有救吗?
  17. android 快速实现图片压缩与上传
  18. 计算机硬件是外观吗,计算机硬件从外观上看主要有主机箱.doc
  19. 日记侠:普通人如何玩转精准引流?
  20. Python全栈(十)Django框架之10.ORM模型对象和QuerySet方法

热门文章

  1. [Jsp] JSP和Servlet页面间的参数的传递和接收
  2. vue网址路由的实时检测
  3. 每个zone的low memory是怎么计算出来的
  4. 【uoj#139】[UER #4]被删除的黑白树 贪心
  5. 倾斜摄影技术在城市规划行业中扮演着什么样的角色?
  6. canvas绘制阴影
  7. [詹兴致矩阵论习题参考解答]习题7.1
  8. Jmeter初学(一)
  9. 高性能JavaScript 读书笔记
  10. Perl文件句柄引用