安卓图片验证码实现

今天项目中遇到了需要在注册时添加图片验证码的需求,故搜集了些资料,low low 的写了个简单的实现方式,我看网上很多人都是创建了Bitmap然后赋值给ImageView来显示,个人觉得Bitmap有点大~~~于是就直接自定义一个呗~

public class VerifyCodeView extends View implements View.OnClickListener {
private static final String TAG = "dah_CodeView";
private int lineNum = 6;//干扰线条数
private int width, height;
private final String DEFAULT_COLOR = "#cccccc";
private Paint codePaint;//验证码画笔
private Paint linePaint;//干扰线画笔
private Path path;
private String checkCodeText = "1234";//验证码的值
private int codeTextLength = 4;//验证码的长度
private float hSpace;//水平方向两个code之间的间距   的   1/2
private final float TEXTSIZE = 30;//默认文本大小
private final int BACKGROUND_COLOR = Color.WHITE;//默认背景色

private void init() {
    path = new Path();
    this.setBackgroundColor(BACKGROUND_COLOR);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
//        drawBorder(canvas);//是否需要边框?
    //绘制验证码文本
    drawCodeText(canvas);
    //绘制干扰线
    drawLines(canvas);
}

/**
     * 绘制验证码文本
     *
     * @param canvas
     */
    private void drawCodeText(Canvas canvas) {
    char[] chars = checkCodeText.toCharArray();
    hSpace = width / codeTextLength / 2;//开始绘制的文本的x位置
    Log.e(TAG, "drawCodeText: hSpace == " + hSpace);
    for (int i = 0; i < codeTextLength; i++) {
        canvas.drawText(chars[i] + "", hSpace, generateRandomHeight(), getCodePaint());
        hSpace += width / (codeTextLength + 1);
    }
}

/**
 * 绘制干扰线
 *
 * @param canvas
 */
private void drawLines(Canvas canvas) {
    for (int i = 0; i < lineNum; i++) {
        int[] lines = generateLines();
        canvas.drawLine(lines[0], lines[1], lines[2], lines[3], getLinePaint());
    }
}

/**
 * 生成随机位置的高度值(Y值)
 *
 * @return Yheight
 */
private float generateRandomHeight() {
    int y = (int) (Math.random() * height);
    // TODO: 2017/5/7 需要根据控件大小进行调整
    if (y < 20) {
        y += 20;
    }
    Log.e(TAG, "generateRandomHeight: y === " + y);
    return y;
}

/**
 * 生成线条的起始位置
 *
 * @return
 */
public int[] generateLines() {
    int[] tmpLines = {0, 0, 0, 0};
    for (int i = 0; i < 4; i += 2) {
        tmpLines[i] = (int) (Math.random() * width);
        tmpLines[i + 1] = (int) (Math.random() * height);
    }
    return tmpLines;
}

//绘制边框
private void drawBorder(Canvas canvas) {
    path.lineTo(width, 0);
    path.lineTo(width, height);
    path.lineTo(0, height);
    path.close();
    canvas.drawPath(path, getDefaultPaint());
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    width = w;
    height = h;
    Log.e(TAG, "onSizeChanged: width == " + width + "         height == " + height);
}

/**
 * 验证码画笔
 *
 * @return codePaint
 */
private Paint getCodePaint() {
    codePaint = getDefaultPaint();
    codePaint.setColor(generateColor(1));
    return codePaint;
}

/**
 * 干扰线画笔
 *
 * @return linePaint
 */
private Paint getLinePaint() {
    linePaint = getDefaultPaint();
    linePaint.setStrokeWidth(1);
    linePaint.setColor(generateColor(1));
    return linePaint;
}

//默认画笔
private Paint getDefaultPaint() {
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStrokeWidth(2);
    paint.setTextSize(TEXTSIZE);
    paint.setColor(Color.parseColor(DEFAULT_COLOR));
    return paint;
}

/**
 * 生成不同的颜色
 *
 * @param rate 色值比例
 * @return
 */
private int generateColor(int rate) {
    Random random = new Random();
    int r = random.nextInt(256) / rate;
    int g = random.nextInt(256) / rate;
    int b = random.nextInt(256) / rate;
    return Color.rgb(r, g, b);
}

public VerifyCodeView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public VerifyCodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@Override
public void onClick(View v) {

}
/**-----------------------------------------------------------------**/
/**
 * 赋值验证码的值
 * 可以作为每次点击的时候更换验证码的作用
 *
 * @param codeString 验证码
 */
public void setCheckCodeText(String codeString) {
    this.checkCodeText = codeString;
    this.codeTextLength = TextUtils.isEmpty(codeString) ? 4 : codeString.length();
    this.invalidate();
}

/**
 * 对外获得验证码值de方法
 *
 * @return checkCodeText
 */
public String getCode() {
    return checkCodeText;
}

}

end…
技术有限~欢迎大神指正~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以使用以下步骤来实现图片验证码: 1. 创建一个包含随机字符的图片:可以使用 Canvas 对象绘制图片,也可以使用第三方库,如 Google 的 reCAPTCHA Android 库。 2. 在布局文件中显示图片:可以使用 ImageView 控件来显示图片。 3. 生成验证码并验证用户输入:可以使用 EditText 控件来让用户输入验证码,并在提交时验证用户输入是否与生成的验证码相同。 以下是一个简单的示例代码,用于生成和显示图片验证码: ``` public class CaptchaActivity extends AppCompatActivity { private ImageView captchaImage; private EditText captchaInput; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_captcha); captchaImage = findViewById(R.id.captcha_image); captchaInput = findViewById(R.id.captcha_input); // 生成随机验证码 String captchaText = generateCaptcha(); // 将验证码显示在图片中 Bitmap captchaBitmap = createCaptchaBitmap(captchaText); captchaImage.setImageBitmap(captchaBitmap); // 在提交时验证用户输入是否正确 Button submitButton = findViewById(R.id.submit_button); submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String userInput = captchaInput.getText().toString(); if (userInput.equals(captchaText)) { Toast.makeText(getApplicationContext(), "验证码正确", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "验证码错误", Toast.LENGTH_SHORT).show(); } } }); } private String generateCaptcha() { // 生成一个包含 4 个随机字符的字符串 Random random = new Random(); StringBuilder captchaBuilder = new StringBuilder(); for (int i = 0; i < 4; i++) { char c = (char) (random.nextInt(26) + 'a'); captchaBuilder.append(c); } return captchaBuilder.toString(); } private Bitmap createCaptchaBitmap(String captchaText) { // 创建一个包含验证码的图片 Bitmap captchaBitmap = Bitmap.createBitmap(200, 100, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(captchaBitmap); canvas.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setTextSize(50); paint.setColor(Color.BLACK); paint.setTextAlign(Paint.Align.CENTER); float x = captchaBitmap.getWidth() / 2f; float y = captchaBitmap.getHeight() / 2f + paint.getTextSize() / 3f; canvas.drawText(captchaText, x, y, paint); return captchaBitmap; } } ``` 在上面的代码中,首先使用 `generateCaptcha()` 方法生成一个包含 4 个随机小写字母的字符串,然后使用 `createCaptchaBitmap()` 方法将验证码绘制到图片中。最后,在提交按钮的点击事件中,使用 `if (userInput.equals(captchaText))` 语句来验证用户输入是否与生成的验证码相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值