Android 验证码功能实现代码
程序员文章站
2024-03-05 12:42:18
先给大家展示下效果图,如果大家感觉还不错,请参考实现代码
很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界...
先给大家展示下效果图,如果大家感觉还不错,请参考实现代码
很简单的一个例子,点击刷新验证码,刷新当前显示的验证码,点击确定,如果输入的和显示的匹配,就会跳转到下一个界面中,这里只是实现了跳转,并没有进行其它的操作
好了 接下来就是代码了
首先看mainactivity的布局
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <textview android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:layout_marginleft="20dp" android:layout_margintop="77dp" android:text="验证码:" /> <edittext android:id="@+id/vc_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/textview1" android:layout_alignbottom="@+id/textview1" android:layout_torightof="@+id/textview1" android:ems="10" > <requestfocus /> </edittext> <button android:id="@+id/vc_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/vc_image" android:layout_alignright="@+id/vc_shuaixi" android:layout_below="@+id/vc_shuaixi" android:layout_margintop="15dp" android:text="确定" /> <button android:id="@+id/vc_shuaixi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignright="@+id/vc_code" android:layout_aligntop="@+id/vc_image" android:layout_marginright="20dp" android:text="刷新验证码" /> <imageview android:id="@+id/vc_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/textview1" android:layout_below="@+id/vc_code" android:layout_margintop="25dp" android:src="@drawable/ic_launcher" /> </relativelayout>
mainactivity代码
package com.example.yanzhengma; import android.r.string; import android.os.bundle; import android.app.activity; import android.content.clipdata.item; import android.content.intent; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.imageview; import android.widget.textview; import android.widget.toast; public class mainactivity extends activity implements onclicklistener { imageview vc_image; // 图片 button vc_shuaixi, vc_ok; string getcode = null; edittext vc_code; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); vc_image = (imageview) findviewbyid(r.id.vc_image); vc_image.setimagebitmap(code.getinstance().getbitmap()); vc_code = (edittext) findviewbyid(r.id.vc_code); getcode = code.getinstance().getcode(); // 获取显示的验证码 vc_shuaixi = (button) findviewbyid(r.id.vc_shuaixi); vc_shuaixi.setonclicklistener(this); vc_ok = (button) findviewbyid(r.id.vc_ok); vc_ok.setonclicklistener(this); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } @override public void onclick(view view) { // todo auto-generated method stub switch (view.getid()) { case r.id.vc_shuaixi: vc_image.setimagebitmap(code.getinstance().getbitmap()); getcode = code.getinstance().getcode(); break; case r.id.vc_ok: string v_code = vc_code.gettext().tostring().trim(); if (v_code == null || v_code.equals("")) { toast.maketext(mainactivity.this, "验证码为空", toast.length_short).show(); } else if (!v_code.equals(getcode)) { toast.maketext(mainactivity.this, "验证码错误", toast.length_short).show(); } else { toast.maketext(mainactivity.this, "验证成功", toast.length_short).show(); intent itintent = new intent(mainactivity.this, secondactivity.class); startactivity(itintent); mainactivity.this.finish(); } break; } } }
好了,到重点部分了,绘制验证码
package com.example.yanzhengma; import java.util.random; import android.graphics.bitmap; import android.graphics.bitmap.config; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; public class code { private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; private static code bputil; private code() { }; public static code getinstance() { if (bputil == null) bputil = new code(); return bputil; } private static final int default_code_length = 4;// 验证码的长度 这里是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; } 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); } }
好了 代码都有注释,应该会看的明白的
以上所述是小编给大家介绍的android 验证码功能实现代码,希望对大家有所帮助