Android图片验证码

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" />

此代码在网上看得大神写的,我自己放在我的博客文章里面没有事情的时候可拿来看看理一下逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值