android 生产图形验证码

原理很简单,首先封装一个类,里面是绘制的图形验证码的一些信息,比如,验证码字符串,验证码长度,干扰线等等,这个网上有很多,我也是参考某个的的封装类写的,下面先上效果图:


代码如下:

[html]  view plain  copy
  1. package com.imageverification;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7.   
  8. import java.util.Random;  
  9.   
  10. /**  
  11.  * Created by Administrator on 2018/5/14/014.  
  12.  */  
  13.   
  14. public class CodeUtil {  
  15.     private static final char[] CHARS = {  
  16.   
  17.             '0','1','2','3','4','5','6','7','8','9',  
  18.             'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',  
  19.             'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',  
  20.     };  
  21.   
  22.     private static CodeUtil mCodeUtil;  
  23.     private int paddingLeft,paddingTop;  
  24.     private StringBuilder stringBuilder=new StringBuilder();  
  25.     private Random random=new Random();  
  26.     private static final int DEFAULT_CODE_LENGTH=4;//验证码长度  
  27.     private static final int DEFAULT_FONT_SIZE =60;//验证码字体大小  
  28.     private static final int DEFAULT_LINE_NUMBER =3;//干扰线  
  29.     private static final int BASE_PADDING_LEFT = 40; //左边距  
  30.     private static final int RANGE_PADDING_LEFT = 30;//左边距范围值  
  31.     private static final int BASE_PADDING_TOP = 70;//上边距  
  32.     private static final int RANGE_PADDING_TOP = 15;//上边距范围值  
  33.     private static final int DEFAULT_WIDTH = 300;//默认宽度.图片的总宽  
  34.     private static final int DEFAULT_HEIGHT = 100;//默认高度.图片的总高  
  35.     private static final int DEFAULT_COLOR = 0xDF;//默认背景颜色值  
  36.     private String code;  
  37.     public static CodeUtil getInstence(){  
  38.         if (mCodeUtil == null){  
  39.             mCodeUtil=new CodeUtil();  
  40.         }  
  41.         return  mCodeUtil;  
  42.     }  
  43.   
  44.     //生成bitmap形式的验证码图片可通过image.setBitmap();获取展示图片  
  45.     public Bitmap createBitmap(){  
  46.         paddingLeft=0;  
  47.         paddingTop=0;  
  48.   
  49.         Bitmap bitmapBitmap.createBitmap(DEFAULT_WIDTH,DEFAULT_HEIGHT,Bitmap.Config.ARGB_8888);  
  50.         Canvas canvas=new Canvas(bitmap);  
  51.         code=createCode();  
  52.         canvas.drawColor(Color.rgb(DEFAULT_COLOR,DEFAULT_COLOR,DEFAULT_COLOR));  
  53.         Paint paint=new Paint();  
  54.         paint.setTextSize(DEFAULT_FONT_SIZE);  
  55.   
  56.         //验证码  
  57.         for (int i = 0; i <code.length() ; i++) {  
  58.                 randomTextStyle(paint);  
  59.                 randomPadding();  
  60.                 canvas.drawText(String.valueOf(code.charAt(i)),paddingLeft,paddingTop,paint);  
  61.         }  
  62.         //干扰线  
  63.         for (int j = 0; j <DEFAULT_LINE_NUMBER ; j++) {  
  64.             drawLine(canvas,paint);  
  65.         }  
  66.   
  67.         canvas.save();  
  68.         canvas.restore();  
  69.         return bitmap;  
  70.   
  71.     }  
  72.   
  73.     /**  
  74.      * 得到图片验证码字符串信息  
  75.      */  
  76.     public String getCode(){  
  77.         return code;  
  78.     }  
  79.   
  80.     //生成干扰线  
  81.     private void drawLine(Canvas canvas, Paint paint) {  
  82.         int color =randomColor();  
  83.         int startX = random.nextInt(DEFAULT_WIDTH);  
  84.         int startY = random.nextInt(DEFAULT_HEIGHT);  
  85.         int stopX = random.nextInt(DEFAULT_WIDTH);  
  86.         int stopY = random.nextInt(DEFAULT_HEIGHT);  
  87.         paint.setStrokeWidth(1);  
  88.         paint.setColor(color);  
  89.         canvas.drawLine(startX, startY, stopX, stopY, paint);  
  90.     }  
  91.   
  92.   
  93.     //随机颜色  
  94.     private int randomColor() {  
  95.         stringBuilder.delete(0, stringBuilder.length()); //使用之前首先清空内容  
  96.   
  97.         String haxString;  
  98.         for (int i = 0; i < 3; i++) {  
  99.             haxString = Integer.toHexString(random.nextInt(0xFF));  
  100.             if (haxString.length() == 1) {  
  101.                 haxString = "0" + haxString;  
  102.             }  
  103.   
  104.             stringBuilder.append(haxString);  
  105.         }  
  106.   
  107.         return Color.parseColor("#" + stringBuilder.toString());  
  108.     }  
  109.   
  110.     //随机间距  
  111.     private void randomPadding() {  
  112.         paddingLeft += BASE_PADDING_LEFT + random.nextInt(RANGE_PADDING_LEFT);  
  113.         paddingTop = BASE_PADDING_TOP + random.nextInt(RANGE_PADDING_TOP);  
  114.     }  
  115.   
  116.     //随机文本样式  
  117.     private void randomTextStyle(Paint paint) {  
  118.         int color = randomColor();  
  119.         paint.setColor(color);  
  120.         paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体  
  121.         float skewX = random.nextInt(11) / 10;  
  122.         skewX = random.nextBoolean() ? skewX : -skewX;  
  123.         paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜  
  124. //        paint.setUnderlineText(true); //true为下划线,false为非下划线  
  125. //        paint.setStrikeThruText(true); //true为删除线,false为非删除线  
  126.     }  
  127.   
  128.   
  129. //生成验证码  
  130.     private String createCode() {  
  131.         stringBuilder.delete(0,stringBuilder.length());  
  132.         for (int i = 0; i <DEFAULT_CODE_LENGTH ; i++) {  
  133.             stringBuilder.append(CHARS[random.nextInt(CHARS  
  134.             .length)]);  
  135.         }  
  136.         return stringBuilder.toString();  
  137.     }  
  138. }  

activity侧:

[html]  view plain  copy
  1. package com.imageverification;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.EditText;  
  8. import android.widget.ImageButton;  
  9. import android.widget.ImageView;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. /**  
  14.  * 图形验证码小demo  
  15.  */  
  16.   
  17. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  18.     private EditText editText;  
  19.     private ImageView imageView;  
  20.     private Button button;  
  21.     private String  finalCode;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.         initView();  
  28.     }  
  29.   
  30.     private void initView() {  
  31.         editText=findViewById(R.id.ed);  
  32.         imageView=findViewById(R.id.img);  
  33.         button=findViewById(R.id.btn);  
  34.   
  35.         imageView.setImageBitmap(CodeUtil.getInstence().createBitmap());  
  36.         finalCode=CodeUtil.getInstence().getCode();  
  37.         button.setOnClickListener(this);  
  38.        imageView.setOnClickListener(this);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onClick(View v) {  
  43.         switch (v.getId()){  
  44.             case R.id.btn:  
  45.                 String message=editText.getText().toString();  
  46.                 if (message.equalsIgnoreCase(finalCode)){  
  47.                     Toast.makeText(MainActivity.this,"验证码输入成功",Toast.LENGTH_SHORT).show();  
  48.                 }else {  
  49.                     Toast.makeText(MainActivity.this,"验证码输入失败",Toast.LENGTH_SHORT).show();  
  50.                 }  
  51.                 break;  
  52.             case R.id.img:  
  53.                 imageView.setImageBitmap(CodeUtil.getInstence().createBitmap());  
  54.                 finalCode=CodeUtil.getInstence().getCode();  
  55.                 break;  
  56.         }  
  57.     }  
  58. }  

布局没有什么东西就不贴了。


注:在此说明刚刚说明,(给我自己看的):由于自己疏忽把代码改了一种写法,为了减少代码量,我直接在类的上面去实现了点击事件,刚开始是两个都设置了setOnClickListener事件,然后只给button设置了上下文,imageView忘记了,在点击的时候随机码切换不了。


完整代码:https://download.youkuaiyun.com/download/qq_36636969/10414614

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值