图形验证码
package com.lhy.test.utils;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import java.util.Random;
/**
* Created by Administrator on 2016/8/4.
*/
public class BitmapCode {
private static final char[] CHARS = {
'0','1', '2', '3', '4', '5', '6', '7', '8', '9'
};
private static BitmapCode bmpCode;
public static BitmapCode getInstance() {
if(bmpCode == null)
bmpCode = new BitmapCode();
return bmpCode;
}
private final static int DEFAULT_WIDTH=100;
private final static int DEFAULT_HEIGHT=40;
private final static int CODE_LENGTH=4;
private int width=DEFAULT_WIDTH;
private int height=DEFAULT_HEIGHT;
private int codeLength=CODE_LENGTH;
private int lineNum=10;
private Random random=new Random();
private String code;
public Bitmap createBitmap(){
createCode();
Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bp);
canvas.drawColor(Color.rgb(241,252,243));
Rect rect=new Rect(0,0,width,height);
{
Paint paint = new Paint();
paint.setColor(Color.GRAY);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
canvas.drawRect(rect, paint);
}
{
Paint textPaint=new Paint();
textPaint.setTextSize(24);
textPaint.setColor(Color.BLUE);
float textWidth=textPaint.measureText("0");
float textHeight=textPaint.ascent()+textPaint.descent();
float paddingTop=(height-textHeight)/2;
float paddingLeft=(width/4f-textWidth)/2;
for(int i=0;i<code.length();i++){
float skewX = random.nextInt(12) / 10;
skewX = random.nextBoolean() ? skewX : -skewX;
textPaint.setTextSkewX(skewX);
canvas.drawText(code.charAt(i)+"",paddingLeft+i*width/4,paddingTop+random.nextInt(10)-5,textPaint);
}
}
{
Paint linePaint = new Paint();
drawLine(canvas, linePaint);
}
canvas.save(Canvas.ALL_SAVE_FLAG );
canvas.restore();
return bp;
}
/**
* 生成随机验证码字符
* @return
*/
private void createCode(){
StringBuilder builder=new StringBuilder();
for(int i=0;i<codeLength;i++) {
builder.append(CHARS[random.nextInt(CHARS.length)]);
}
this.code=builder.toString();
}
public String getCode(){
return this.code;
}
private void drawLine(Canvas canvas,Paint paint){
for(int i=0;i<lineNum;i++){
paint.setColor(randomColor());
int startX=random.nextInt(width);
int startY=random.nextInt(height);
int endX=random.nextInt(width);
int endY=random.nextInt(height);
canvas.drawLine(startX,startY,endX,endY,paint);
}
}
private int randomColor(){
int red=random.nextInt(256);
int green=random.nextInt(256);
int blue=random.nextInt(256);
return Color.rgb(red,green,blue);
}
}