首页 > 代码库 > 验证码

验证码

  1. import java.util.Random;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Matrix;  
  8. import android.graphics.Paint;  
  9. import android.graphics.Bitmap.Config;  
  10. import android.util.AttributeSet;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13.   
  14. public class ValidateImageView extends View {  
  15.   
  16.     private String TAG = "ValidateImageView";  
  17.     private Paint paint = new Paint();  
  18.     /* 
  19.      * 验证码内容 
  20.      */  
  21.     private String[] content = null;  
  22.     /* 
  23.      * 验证码图片 
  24.      */  
  25.     private Bitmap bitmap = null;  
  26.   
  27.     public ValidateImageView(Context context, AttributeSet attrs) {  
  28.         super(context, attrs);  
  29.     }  
  30.   
  31.     @Override  
  32.     public void draw(Canvas canvas) {  
  33.         // TODO Auto-generated method stub  
  34.         if (bitmap != null) {  
  35.             canvas.drawBitmap(bitmap, 0, 0, paint);  
  36.         } else {  
  37.             paint.setColor(Color.GRAY);  
  38.             paint.setTextSize(20);  
  39.             canvas.drawText("点击换一换", 10, 30, paint);  
  40.         }  
  41.         super.draw(canvas);  
  42.     }  
  43.   
  44.     /** 
  45.      * 得到验证码;设置图片 
  46.      * @param strContent 验证码的字符串数组 
  47.      * @return 
  48.      */  
  49.     public String[] getValidataAndSetImage(String[] strContent) {  
  50.         content = strContent;  
  51.         //产生随机数,并返回  
  52.         String [] strRes = generageRadom(strContent);  
  53.         Log.i(TAG, "generate validate code: " + strRes[0] + strRes[1] + strRes[2] + strRes[3]);  
  54. //      String strRes = generageRadomStr(strContent);  
  55.         //传随机串和随机数  
  56.         bitmap = generateValidate(content,strRes);  
  57.         invalidate();  
  58.           
  59.         return strRes;  
  60.     }  
  61.   
  62.     private Bitmap generateValidate(String[] strContent,String [] strRes) {  
  63.         int width = 120,height = 50;  
  64.           
  65.         int isRes = isStrContent(strContent);  
  66.         if (isRes == 0) {  
  67.             return null;  
  68.         }  
  69.           
  70.         Bitmap sourceBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
  71.         Canvas canvas = new Canvas(sourceBitmap);  
  72.         Paint p = new Paint();  
  73.         p.setTextSize(height / 2);  
  74.         p.setFakeBoldText(true);  
  75.           
  76.         p.setColor(getRandColor(200, 230, 170));  
  77.         canvas.drawText(strRes[0], 10, height / 2, p);  
  78.         Matrix m1 = new Matrix();  
  79.         m1.setRotate(15);  
  80.         canvas.setMatrix(m1);  
  81.           
  82.         p.setColor(getRandColor(200, 230, 170));  
  83.         canvas.drawText(strRes[1], 40, height / 2, p);  
  84.         m1.setRotate(10);  
  85.         canvas.setMatrix(m1);  
  86.           
  87.         p.setColor(getRandColor(200, 230, 170));  
  88.         canvas.drawText(strRes[2], 70, height / 2 - 10, p);  
  89.         m1.setRotate(15);  
  90.         canvas.setMatrix(m1);  
  91.           
  92.         p.setColor(getRandColor(200, 230, 170));  
  93.         canvas.drawText(strRes[3], 100, height / 2 - 15, p);  
  94.         m1.setRotate(20);  
  95.         canvas.setMatrix(m1);  
  96.           
  97.         //障碍设置  
  98.         int startX = 0,startY = 0,stopX = 0,stopY = 0;  
  99.         for (int i = 0; i < 55; i++) {  
  100.             startX = pointRadom(width);  
  101.             startY = pointRadom(height);  
  102.             stopX = pointRadom(15);  
  103.             stopY = pointRadom(15);  
  104.             p.setColor(getRandColor(200, 230, 220));  
  105.             canvas.drawLine(startX, startY - 20, startX + stopX, startY + stopY - 20, p);  
  106.         }  
  107.           
  108.         canvas.save();  
  109.         return sourceBitmap;  
  110.     }  
  111.       
  112.     private int isStrContent(String[] strContent) {  
  113.         if (strContent == null || strContent.length <= 0) {  
  114.             return 0;  
  115.         } else {  
  116.             return 1;  
  117.         }  
  118.     }  
  119.       
  120.     /** 
  121.      * 从指定数组中随机取出4个字符(数组) 
  122.      * @param strContent 
  123.      * @return 
  124.      */  
  125.     private String[] generageRadom(String[] strContent){  
  126.         String[] str = new String[4];  
  127.         // 随机串的个数  
  128.         int count = strContent.length;  
  129.         // 生成4个随机数  
  130.         Random random = new Random();  
  131.         int randomResFirst = random.nextInt(count);  
  132.         int randomResSecond = random.nextInt(count);  
  133.         int randomResThird = random.nextInt(count);  
  134.         int randomResFourth = random.nextInt(count);  
  135.           
  136.         str[0] = strContent[randomResFirst].toString().trim();  
  137.         str[1] = strContent[randomResSecond].toString().trim();  
  138.         str[2] = strContent[randomResThird].toString().trim();  
  139.         str[3] = strContent[randomResFourth].toString().trim();  
  140.         return str;  
  141.     }  
  142.       
  143.     /** 
  144.      * 从指定数组中随机取出4个字符(字符串) 
  145.      * @param strContent 
  146.      * @return 
  147.      */  
  148.     private String generageRadomStr(String[] strContent){  
  149.         StringBuilder str = new StringBuilder();  
  150.         // 随机串的个数  
  151.         int count = strContent.length;  
  152.         // 生成4个随机数  
  153.         Random random = new Random();  
  154.         int randomResFirst = random.nextInt(count);  
  155.         int randomResSecond = random.nextInt(count);  
  156.         int randomResThird = random.nextInt(count);  
  157.         int randomResFourth = random.nextInt(count);  
  158.           
  159.         str.append(strContent[randomResFirst].toString().trim());  
  160.         str.append(strContent[randomResSecond].toString().trim());  
  161.         str.append(strContent[randomResThird].toString().trim());  
  162.         str.append(strContent[randomResFourth].toString().trim());  
  163.         return str.toString();  
  164.     }  
  165.       
  166.     private int pointRadom(int n){  
  167.         Random r = new Random();  
  168.         return r.nextInt(n);  
  169.     }  
  170.   
  171.     /** 
  172.      * 给定范围获得随机颜色 
  173.      *  
  174.      * @param rc 
  175.      *            0-255 
  176.      * @param gc 
  177.      *            0-255 
  178.      * @param bc 
  179.      *            0-255 
  180.      * @return colorValue 颜色值,使用setColor(colorValue) 
  181.      */  
  182.     public int getRandColor(int rc, int gc, int bc) {  
  183.         Random random = new Random();  
  184.         if (rc > 255)  
  185.             rc = 255;  
  186.         if (gc > 255)  
  187.             gc = 255;  
  188.         if (bc > 255)  
  189.             bc = 255;  
  190.         int r = rc + random.nextInt(rc);  
  191.         int g = gc + random.nextInt(gc);  
  192.         int b = bc + random.nextInt(bc);  
  193.         return Color.rgb(r, g, b);  
  194.     }  
  195.   
  196. }

验证码