public class ValidateImageView extends View{
private String TAG = “ValidateImageView”;
private Paint paint = new Paint();
/*
* 验证码内容
*/
private String[] content = null;
/*
* 验证码图片
*/
private Bitmap bitmap = null;
public ValidateImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ValidateImageView(Context context) {
super(context);
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, paint);
} else {
paint.setColor(Color.GRAY);
paint.setTextSize(20);
canvas.drawText("点击换一换", 10, 30, paint);
}
super.draw(canvas);
}
/**
* 得到验证码;设置图片
* @param strContent 验证码的字符串数组
* @return
*/
public String[] getValidataAndSetImage(String[] strContent) {
content = strContent;
//产生随机数,并返回
String [] strRes = generageRadom(strContent);
Log.i(TAG, "generate validate code: " + strRes[0] + strRes[1] + strRes[2] + strRes[3]);
// String strRes = generageRadomStr(strContent);
//传随机串和随机数
bitmap = generateValidate(content,strRes);
invalidate();
return strRes;
}
private Bitmap generateValidate(String[] strContent,String [] strRes) {
int width = 120,height = 120;
int isRes = isStrContent(strContent);
if (isRes == 0) {
return null;
}
Bitmap sourceBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(sourceBitmap);
Paint p = new Paint();
//设置验证码字体大小,根据高度
p.setTextSize(height / 2);
p.setFakeBoldText(true);
p.setColor(getRandColor(200, 230, 170));
canvas.drawText(strRes[0], 10, height / 2, p);
Matrix m1 = new Matrix();
m1.setRotate(15);
canvas.setMatrix(m1);
p.setColor(getRandColor(200, 230, 170));
canvas.drawText(strRes[1], 40, height / 2, p);
m1.setRotate(10);
canvas.setMatrix(m1);
p.setColor(getRandColor(200, 230, 170));
canvas.drawText(strRes[2], 70, height / 2 - 10, p);
m1.setRotate(15);
canvas.setMatrix(m1);
p.setColor(getRandColor(200, 230, 170));
canvas.drawText(strRes[3], 100, height / 2 - 15, p);
m1.setRotate(20);
canvas.setMatrix(m1);
//障碍设置
int startX = 0,startY = 0,stopX = 0,stopY = 0;
for (int i = 0; i < 55; i++) {
startX = pointRadom(width);
startY = pointRadom(height);
stopX = pointRadom(15);
stopY = pointRadom(15);
p.setColor(getRandColor(200, 230, 220));
canvas.drawLine(startX, startY - 20, startX + stopX, startY + stopY - 20, p);
}
canvas.save();
return sourceBitmap;
}
private int isStrContent(String[] strContent) {
if (strContent == null || strContent.length <= 0) {
return 0;
} else {
return 1;
}
}
/**
* 从指定数组中随机取出4个字符(数组)
* @param strContent
* @return
*/
private String[] generageRadom(String[] strContent){
String[] str = new String[4];
// 随机串的个数
int count = strContent.length;
// 生成4个随机数
Random random = new Random();
int randomResFirst = random.nextInt(count);
int randomResSecond = random.nextInt(count);
int randomResThird = random.nextInt(count);
int randomResFourth = random.nextInt(count);
str[0] = strContent[randomResFirst].toString().trim();
str[1] = strContent[randomResSecond].toString().trim();
str[2] = strContent[randomResThird].toString().trim();
str[3] = strContent[randomResFourth].toString().trim();
return str;
}
/**
* 从指定数组中随机取出4个字符(字符串)
* @param strContent
* @return
*/
private String generageRadomStr(String[] strContent){
StringBuilder str = new StringBuilder();
// 随机串的个数
int count = strContent.length;
// 生成4个随机数
Random random = new Random();
int randomResFirst = random.nextInt(count);
int randomResSecond = random.nextInt(count);
int randomResThird = random.nextInt(count);
int randomResFourth = random.nextInt(count);
str.append(strContent[randomResFirst].toString().trim());
str.append(strContent[randomResSecond].toString().trim());
str.append(strContent[randomResThird].toString().trim());
str.append(strContent[randomResFourth].toString().trim());
return str.toString();
}
private int pointRadom(int n){
Random r = new Random();
return r.nextInt(n);
}
/**
* 给定范围获得随机颜色
*
* @param rc
* 0-255
* @param gc
* 0-255
* @param bc
* 0-255
* @return colorValue 颜色值,使用setColor(colorValue)
*/
public int getRandColor(int rc, int gc, int bc) {
Random random = new Random();
if (rc > 255)
rc = 255;
if (gc > 255)
gc = 255;
if (bc > 255)
bc = 255;
int r = rc + random.nextInt(rc);
int g = gc + random.nextInt(gc);
int b = bc + random.nextInt(bc);
return Color.rgb(r, g, b);
}
/////////////////////////////
在activity中调用
private ValidateImageView view = null;
String[] responseArray = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linear = (LinearLayout)findViewById(R.id.linear);
view = new ValidateImageView(this);
linear.addView(view);
responseArray = view.getValidataAndSetImage(getRandomInteger());
Toast.makeText(this, getResponseStr(responseArray), 2000).show();
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
responseArray = view.getValidataAndSetImage(getRandomInteger());
Toast.makeText(MainActivity.this, getResponseStr(responseArray), 2000).show();
}
});
}
//为数组赋值1~9的随机数
private String[] getRandomInteger(){
String[] reuestArray = new String[4];
for(int i = 0 ; i < 4 ; i++){
reuestArray[i] = String.valueOf((int)(Math.random()*9+1));
}
return reuestArray;
}
//获取返回的数组
private String getResponseStr(String[] response){
StringBuffer stringBuffer = new StringBuffer();
for(String str : response){
stringBuffer.append(str);
}
return stringBuffer.toString();
}
//布局
<LinearLayout
android:id="@+id/linear"
android:layout_alignParentRight="true"
android:layout_width="120dp"
android:layout_height="50dp"
android:orientation="horizontal" />
此代码在网上看得大神写的,我自己放在我的博客文章里面没有事情的时候可拿来看看理一下逻辑