import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import java.util.Random;public class Code {    //随机数数组    private static final char[] CHARS = {            '0','1','2', '3', '4', '5', '6', '7', '8', '9',            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', '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 = 6;    //默认字体大小     private static final int DEFAULT_FONT_SIZE = 28;    //默认线条的条数    private static final int DEFAULT_LINE_NUMBER = 2;    //padding值 可以自行调整,这块是跟几位验证码有关,所以根据几位验证码自行调整    private static final int BASE_PADDING_LEFT = 25, RANGE_PADDING_LEFT = 10, BASE_PADDING_TOP = 20, RANGE_PADDING_TOP = 20;    //验证码的默认宽高 生成的bitmap的宽度与高度,根据验证码位数以及间距等,调整测试    private static final int DEFAULT_WIDTH = 240, DEFAULT_HEIGHT = 50;    //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() {        padding_left = 0;        Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//图片清晰度,可以改        Canvas c = new Canvas(bp);        code = createCode();        c.drawColor(Color.WHITE);//这里底色可以改成自己想要底色        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();//保存        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);    }}

原文章链接https://www.cnblogs.com/jenson138/p/4437088.html

更多相关文章

  1. Android(安卓)之 Spinner用法介绍
  2. Android动态关闭mainfest中的receiver
  3. Android(安卓)-- 生成二维码
  4. android studio 生成 release aar
  5. 将 android sql文件放生成在sd卡
  6. android生成json
  7. Android(安卓)-- EditText插入表情
  8. android Settings 修改默认主题为白底黑字
  9. GridView的使用

随机推荐

  1. android 选择本地图片并截剪图片保存到,sd
  2. Android(安卓)DataBinding的简单使用
  3. 如何隐藏滚动条在ScrollView中
  4. Android(安卓)EditText 禁止软键盘弹出
  5. Android(安卓)本地代码中的LIKELY和UNLIK
  6. 如果获取android源码
  7. Android与Java AIO实现简单Echo服务器与
  8. windows8.1下android开发环境搭建(Eclips
  9. android 已知资源名称获取资源ID
  10. Android下pm 命令详解