Android绘制验证码的实例代码

作者:andoter 时间:2023-10-30 13:57:15 

在前面仿华为加载动画、仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制。在本例中,我们将绘制常见的验证码。

一、效果图

Android绘制验证码的实例代码

二、知识点与思路分析

通过上面的效果图观察,我们可以看到里面有绘制的随机线条,随机绘制的验证码。

绘制线条,直线或曲线

绘制文本,生成的验证码文本的绘制

绘制圆点。

三、代码编写


/**
* Created by Iflytek_dsw on 2017/7/3.
*/
public class IdentifyCodeUtil {
 private static final int CODE_NUMBER = 4;
 private static final int LINE_NUMBER = 5;
 private static final int POINT_NUMBER = 10;
 private StringBuffer stringBuffer = null;
 private Random random = new Random();
 //随机数数组
 private static final char[] CHARS = {
     '2', '3', '4', '5', '6', '7', '8', '9',
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
     'n', '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', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
 };
 private static IdentifyCodeUtil instance;
 public static IdentifyCodeUtil getInstance(){
   if(instance == null){
     instance = new IdentifyCodeUtil();
   }
   return instance;
 }
 public Bitmap createBitmapCode(int width, int height){
   Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
   Canvas canvas = new Canvas(bitmap);
   canvas.drawColor(Color.LTGRAY);
   drawCodeText(canvas, width, height);
   drawLines(canvas, width, height);
   drawPoint(canvas, width, height);
   return bitmap;
 }
 /**
  * 返回验证码
  * @return 验证码生成的字符串
  */
 public String getIdentifyCode(){
   if(stringBuffer == null){
     return "";
   }
   return stringBuffer.toString();
 }
 /**
  * 生成验证码
  * @return
  */
 private String buildIdentifyCode(){
   StringBuffer stringBuffer = new StringBuffer();
   for(int i=0; i < CODE_NUMBER;i++){
     stringBuffer.append(CHARS[random.nextInt(CHARS.length)]);
   }
   Log.d("Code",stringBuffer.toString());
   return stringBuffer.toString();
 }
 /**
  * 绘制文本
  * @param canvas  画布
  * @param width   宽度
  * @param height  高度
  */
 private void drawCodeText(Canvas canvas,int width, int height){
   Paint paint = new Paint();
   paint.setTextSize(50);
   /**构建验证码code*/
   String text = buildIdentifyCode();
   float textLength = paint.measureText(text);
   int startMaxLength = (int) ((width - textLength) / 2);
   /**随机计算验证码绘制每次开头的位置*/
   int startPosition = random.nextInt(startMaxLength);
   //绘制文字
   for(int index = 0; index < text.length(); index++){
     /**生成旋转的角度*/
     int offsetDegree = random.nextInt(15);
     /**这里只会产生0和1,如果是1那么正旋转正角度,否则旋转负角度*/
     offsetDegree = random.nextInt(2) == 1 ? offsetDegree : -offsetDegree;
     canvas.save();
     //设置旋转
     canvas.rotate(offsetDegree, width / 2, height / 2);
     /**生成随机的颜色*/
     paint.setARGB(255, random.nextInt(200) + 20, random.nextInt(200) + 20,
         random.nextInt(200) + 20);
     char tempChar = text.charAt(index);
     //给画笔设置随机颜色
     canvas.drawText(String.valueOf(tempChar), startPosition +index * textLength / text.length() +15,
         height * 3 / 5f,paint);
     canvas.restore();
   }
 }
 /**
  * 生成干扰线
  * @param canvas
  * @param width
  * @param height
  */
 private void drawLines(Canvas canvas,int width, int height){
   Paint paint = new Paint();
   paint.setStrokeWidth(3);
   for(int i = 0;i < LINE_NUMBER;i++){
     paint.setARGB(255, random.nextInt(200) + 30, random.nextInt(200) + 30, random.nextInt(200) + 30);
     int startX = random.nextInt(width);
     int startY = random.nextInt(height);
     int endX = random.nextInt(width);
     int endY = random.nextInt(height);
     canvas.drawLine(startX, startY, endX, endY, paint);
   }
 }
 /**
  * 生成干扰点
  */
 private void drawPoint(Canvas canvas, int width, int height) {
   Paint paint = new Paint();
   paint.setStrokeWidth(3);
   paint.setColor(Color.GRAY);
   for(int i=0; i< POINT_NUMBER; i++){
     PointF pointF = new PointF(random.nextInt(width) + 10, random.nextInt(height) + 10);
     canvas.drawPoint(pointF.x, pointF.y, paint);
   }
 }
}

Android绘制验证码的实例代码

以上所述是小编给大家介绍的Android绘制验证码的实例代码网站的支持!

来源:http://blog.csdn.net/mr_dsw/article/details/74278172

标签:android,验证码
0
投稿

猜你喜欢

  • java多线程详细总结

    2023-01-10 14:16:04
  • java实现的简单猜数字游戏代码

    2023-06-17 22:56:22
  • Android开发手册shape属性和子属性使用说明

    2023-11-02 09:44:43
  • Java新API的时间格式化

    2023-02-14 19:24:37
  • SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码

    2021-06-23 16:48:08
  • Spring整合mybatis实现过程详解

    2022-05-23 02:10:23
  • JAVA集合框架Map特性及实例解析

    2021-06-05 02:23:39
  • 详解Spark Sql在UDF中如何引用外部数据

    2021-08-17 14:51:17
  • Java内置GUI Frame类的使用

    2021-10-25 18:06:49
  • C#算法之整数反转

    2021-09-24 18:36:49
  • SpringBoot+Spring Security+JWT实现RESTful Api权限控制的方法

    2022-07-18 03:38:36
  • 宝塔面板配置及部署javaweb教程(全网最全)

    2023-11-10 15:26:27
  • Java MongoDB数据库连接方法梳理

    2023-11-25 01:01:20
  • Springboot中如何使用Redisson实现分布式锁浅析

    2023-10-01 18:48:29
  • 基于C#实现的屏幕指定区域截屏代码

    2021-12-31 19:42:09
  • Java多线程之ThreadLocal原理总结

    2023-11-02 22:58:36
  • Android实现启动页倒计时效果

    2021-07-26 20:50:14
  • 应用启动数据初始化接口CommandLineRunner和Application详解

    2023-02-06 05:00:33
  • RocketMQ存储文件的实现

    2023-03-16 15:11:27
  • java 保留两位小数的几种方法

    2022-05-11 16:38:27
  • asp之家 软件编程 m.aspxhome.com