模仿了网页上验证码的显示、输入和验证。
这是初始显示界面
这是与验证码不同时
验证成功后会发出一句提示,再换一组验证码
char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
sb = new StringBuffer();
for (int i = 0; i < 4; i++) {
index = r.nextInt(len);
sb.append(ch[index]);
}
首先先设置4位验证码
然后通过自定义的方法来显示
syzm.SetYzm(sb);
public class CustomYZView extends View { private Paint mPaint; private static final int STOKE_WIDTH = 5; private float density; private int Mwidth = 150; private int Mheight = 150; private int[] Ctext; StringBuffer sb = new StringBuffer(); public CustomYZView(Context context) { super(context); initPaint(); } public CustomYZView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } public CustomYZView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } private void initPaint() { init(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(STOKE_WIDTH); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setTextSize(25 * density); mPaint.setColor(getResources().getColor(R.color.darkblack)); } private void init() { DisplayMetrics dm = new DisplayMetrics(); dm = getContext().getApplicationContext().getResources().getDisplayMetrics(); density = dm.density; Mwidth = (int)(300 * density); Mheight = (int)(50 * density); } public void SetYzm(StringBuffer sb){ this.sb = sb; ShowYzm(); } private void ShowYzm() { Random r = new Random(); setBackgroundColor(Color.argb(0xff, r.nextInt(88), r.nextInt(188), r.nextInt(255))); Ctext = new int[sb.length()]; for (int i = 0; i < sb.length(); i++) { Ctext[i] = Color.argb(0xff, r.nextInt(88), r.nextInt(188), r.nextInt(255)); } invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(Mwidth, Mheight); } @Override protected void onDraw(Canvas canvas) { for (int i = 0; i < sb.length(); i++) { mPaint.setColor(Ctext[i]); String text = sb.charAt(i) + ""; float textWidth = mPaint.measureText(text); float width = textWidth + 10 * density; float x = Mwidth / 2 - ((sb.length() / 2 - i) * width); Paint.FontMetrics metrics = mPaint.getFontMetrics(); float dy = -(metrics.descent + metrics.ascent) / 2; float y = Mheight / 2 + dy; canvas.drawText(text, x, y, mPaint); } } }
其中需要说明的是随机的Color不能在onDraw方法中定义。在编码的过程中,每次点击输入框,键盘退出和显示时,onDraw方法会重绘,这就会导致每次4个字母的颜色会变化,当然如果觉得这个效果比较炫的话,可以这样搞这里就是最后的验证过程,为了方便我把edittext里的都大写了,如果想严谨一点的话,这一步可以去掉private void ShowYzm() { Random r = new Random(); setBackgroundColor(Color.argb(0xff, r.nextInt(88), r.nextInt(188), r.nextInt(255))); Ctext = new int[sb.length()]; for (int i = 0; i < sb.length(); i++) { Ctext[i] = Color.argb(0xff, r.nextInt(88), r.nextInt(188), r.nextInt(255)); } invalidate(); }
http://download.csdn.net/detail/u013898922/9626020String et = et_yzm.getText().toString().toUpperCase(); if(et.equals(sb.toString())){ Toast.makeText(getApplicationContext(),"验证成功",Toast.LENGTH_SHORT).show(); InitData(); }else { Toast.makeText(getApplicationContext(),"验证失败请重新输入",Toast.LENGTH_SHORT).show(); et_yzm.setText(""); }