Android 图形验证码

来源:互联网 发布:龙腾世纪审判 知乎 编辑:程序博客网 时间:2024/06/05 03:51

首先呢先让你们看一下效果



下面呢其实主要急死一个工具类

public class CodeUtils {    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', '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'    };    private static CodeUtils mCodeUtils;    private int mPaddingLeft, mPaddingTop;    private StringBuilder mBuilder = new StringBuilder();    private Random mRandom = new Random();    //Default Settings    private static final int DEFAULT_CODE_LENGTH = 4;//验证码的长度    private static final int DEFAULT_FONT_SIZE = 60;//字体大小    private static final int DEFAULT_LINE_NUMBER = 3;//多少条干扰线    private static final int BASE_PADDING_LEFT = 40; //左边距    private static final int RANGE_PADDING_LEFT = 30;//左边距范围值    private static final int BASE_PADDING_TOP = 70;//上边距    private static final int RANGE_PADDING_TOP = 15;//上边距范围值    private static final int DEFAULT_WIDTH = 300;//默认宽度.图片的总宽    private static final int DEFAULT_HEIGHT = 100;//默认高度.图片的总高    private static final int DEFAULT_COLOR = 0xDF;//默认背景颜色值    private String code;    public static CodeUtils getInstance() {        if(mCodeUtils == null) {            mCodeUtils = new CodeUtils();        }        return mCodeUtils;    }    //生成验证码图片    public Bitmap createBitmap() {        mPaddingLeft = 0; //每次生成验证码图片时初始化        mPaddingTop = 0;        Bitmap bitmap = Bitmap.createBitmap(DEFAULT_WIDTH, DEFAULT_HEIGHT, Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        code = createCode();        canvas.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));        Paint paint = new Paint();        paint.setTextSize(DEFAULT_FONT_SIZE);        for (int i = 0; i < code.length(); i++) {            randomTextStyle(paint);            randomPadding();            canvas.drawText(code.charAt(i) + "" , mPaddingLeft, mPaddingTop, paint);        }        //干扰线        for (int i = 0; i < DEFAULT_LINE_NUMBER; i++) {            drawLine(canvas, paint);        }        canvas.save(Canvas.ALL_SAVE_FLAG);//保存        canvas.restore();        return bitmap;    }    /**     * 得到图片中的验证码字符串     * @return     */    public String getCode() {        return code;    }    //生成验证码    public String createCode() {        mBuilder.delete(0, mBuilder.length()); //使用之前首先清空内容        for (int i = 0; i < DEFAULT_CODE_LENGTH; i++) {            mBuilder.append(CHARS[mRandom.nextInt(CHARS.length)]);        }        return mBuilder.toString();    }    //生成干扰线    private void drawLine(Canvas canvas, Paint paint) {        int color = randomColor();        int startX = mRandom.nextInt(DEFAULT_WIDTH);        int startY = mRandom.nextInt(DEFAULT_HEIGHT);        int stopX = mRandom.nextInt(DEFAULT_WIDTH);        int stopY = mRandom.nextInt(DEFAULT_HEIGHT);        paint.setStrokeWidth(1);        paint.setColor(color);        canvas.drawLine(startX, startY, stopX, stopY, paint);    }    //随机颜色    private int randomColor() {        mBuilder.delete(0, mBuilder.length()); //使用之前首先清空内容        String haxString;        for (int i = 0; i < 3; i++) {            haxString = Integer.toHexString(mRandom.nextInt(0xFF));            if (haxString.length() == 1) {                haxString = "0" + haxString;            }            mBuilder.append(haxString);        }        return Color.parseColor("#" + mBuilder.toString());    }    //随机文本样式    private void randomTextStyle(Paint paint) {        int color = randomColor();        paint.setColor(color);        paint.setFakeBoldText(mRandom.nextBoolean());  //true为粗体,false为非粗体        float skewX = mRandom.nextInt(11) / 10;        skewX = mRandom.nextBoolean() ? skewX : -skewX;        paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜//        paint.setUnderlineText(true); //true为下划线,false为非下划线//        paint.setStrikeThruText(true); //true为删除线,false为非删除线    }    //随机间距    private void randomPadding() {        mPaddingLeft += BASE_PADDING_LEFT + mRandom.nextInt(RANGE_PADDING_LEFT);        mPaddingTop = BASE_PADDING_TOP + mRandom.nextInt(RANGE_PADDING_TOP);    }}

具体的使用就看你们了。。。我就不给你们说了,,如果想知道就给我留言我给你说啊

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 千层石假山价格 庭院鱼池假山 石头假山制作 小型假山制作 园林假山制作 假山流水喷泉厂家 哪里有卖假山的 庭院假山制作 塑石假山价格 真石假山制作 大型假山施工 吸水石假山制作 假山制作价格 塑石假山报价 大型假山流水喷泉 上水石假山制作 假山设计制作 室内假山制作 水泥塑石假山 假山流水喷泉水景 假山鱼池制作 假山喷泉厂家 吸水石假山价格 塑石假山造价 鱼池假山设计 室内假山水景 塑石假山多少钱一平方 园林假山景观工程 庭院假山设计 室内千层石假山 大型上水石假山 水池假山设计 阳台假山鱼池 斧劈石假山价格 塑石假山做法 贵州假山制作 园林喷泉假山 假山流水制作 假山盆景喷泉 室内景观假山鱼池 地球仪歌词