Android 验证码实现

先上效果图:canvas

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=


自定义VerificationCode 类。app

 

public class VerificationCode {dom

private static final char[] CHARS = { '0', '1', '2', '3', '4', '5', '6',ide

'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',ui

'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',spa

'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',rest

'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',code

'X', 'Y', 'Z' };blog

private static VerificationCode bpUtil;get

 

private VerificationCode() {

};

 

public static VerificationCode getInstance() {

if (bpUtil == null)

bpUtil = new VerificationCode();

return bpUtil;

}

 

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 = 20; // 左边距

private static final int RANGE_PADDING_LEFT = 35;// 左边距范围值

private static final int BASE_PADDING_TOP = 42;// 上边距

private static final int RANGE_PADDING_TOP = 15;// 上边距范围值

private static final int DEFAULT_WIDTH = 200;

private static final int DEFAULT_HEIGHT = 70;

private final int DEFAULT_COLOR = 0xdf;// 默认背景颜色值

 

private int width = DEFAULT_WIDTH;

private int height = DEFAULT_HEIGHT;

 

private int base_padding_left = BASE_PADDING_LEFT;

private int range_padding_left = RANGE_PADDING_LEFT;

private int base_padding_top = BASE_PADDING_TOP;

private int range_padding_top = RANGE_PADDING_TOP;

 

private int codeLength = DEFAULT_CODE_LENGTH;

private int line_number = DEFAULT_LINE_NUMBER;

private int font_size = DEFAULT_FONT_SIZE;

 

private String code;// 保存生成的验证码

private int padding_left, padding_top;

private Random random = new Random();

 

private Bitmap createBitmap() {

padding_left = 0;

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

Canvas c = new Canvas(bp);

code = createCode();

c.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));

Paint paint = new Paint();

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.toLowerCase();

}

 

public Bitmap getBitmap() {

return createBitmap();

}

 

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类型参数,负数表示右斜,整数左斜

}

 

private void randomPadding() {

padding_left += base_padding_left + random.nextInt(range_padding_left);

padding_top = base_padding_top + random.nextInt(range_padding_top);

}

 

}

如何使用:

调用 VerificationCode.getInstance().getBitmap() 赋予imageview便可显示验证码.

例如:

 

 

ImageView vc_image = (ImageView) findViewById(R.id.vc_image);

vc_image.setImageBitmap(VerificationCode.getInstance().getBitmap());

相关文章
相关标签/搜索