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绘制验证码的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android RecyclerView显示Item布局不一致解决办法

    RecyclerView显示Item布局不一致 在自定义RecyclerAdapter的时候,在重写onCreateViewHolder方法是使用了 @Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,layoutId,null); return view; } 进行生成布局,结果发现生成的布局没有LayoutParams.以前自定义View的

  • Android中应用前后台切换监听的实现详解

    前言 最近在工作中遇到了这么一个需求:如何实现 Android 应用前后台切换的监听?下面来一起看看详细的介绍: iOS 内边是可以实现的,AppDelegate 给了一个回调监听: @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillResignActive(_ application: UIApplication) { // Sent when the a

  • Android上使用grpc的方法教程

    前言 最近的一个项目使用到了grpc实现跨平台的远程调用,在安卓端使用的时候遇到了一些坑,这里记录一下. 首先根据grpc android的官方Demo配置grpc依赖,测试它的hello world工程. 编译谷歌官方的helloworld工程 添加rotobuf-gradle-plugin插件 首先添加rotobuf-gradle-plugin插件,他是用来从proto文件自动生成java代码的: //Project的build.gradle中添加rotobuf-gradle-plugin插

  • Android动画之小球拟合动画实例

    Android动画之小球拟合动画实例 实现效果: 动画组成: 1.通过三阶贝塞尔曲线来拟合圆,拟合系数的由来,以及怎么选控制点. 2.利用画布canvas.translate,以及scale,rotate的方法,来渐变绘制的过程. 3.熟悉拟合过程. 4.不熟悉的话,先绘制辅助点的移动路线,对理解两个圆的分裂的拟合过程有好处. package com.example.administrator.animationworkdemo.views; import android.animation.V

  • Android 解决WebView无法上传文件的问题

    Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

  • Android文件下载功能实现代码

    本文实例为大家分享了Android文件下载功能的具体代码,供大家参考,具体内容如下 1.普通单线程下载文件: 直接使用URLConnection.openStream()打开网络输入流,然后将流写入到文件中! public static void downLoad(String path,Context context)throws Exception { URL url = new URL(path); InputStream is = url.openStream(); //截取最后的文件名

  • Android用Scroller实现一个可向上滑动的底部导航栏

    静静等了5分钟竟不知道如何写我这第一篇文章.每次都想好好的学习学习,有时间多敲敲代码,写几篇自己的文章.今天终于开始实行了,还是有点小激动的.哈哈! 好了废话就不多收了.我今天想实现的一个功能就是一个可以上滑底部菜单栏.为什么我会想搞这么个东西呢, 还是源于一年前,我们app 有这么个需求,当时百度也好谷歌也好,都没有找到想要的效果,其实很简单的一个效果.但是当时我也是真的太菜了,所有有关自定义的控件真的是不会,看别人的代码还好,真要是自己写,一点头绪都没有.因为我试着写了,真的不行啊.当时觉得

  • 详解Android ViewCompat的作用

    详解Android ViewCompat的作用 ViewCompat类主要是用来提供兼容性的, 比如我最近看的比较的多的canScrollVertically方法, 在ViewCompat里面针对几个版本有不同的实现, 原理上还是根据版本判断, 有时甚至还要判断传入参数的类型. 但是要注意的是, ViewCompat仅仅让你调用不崩溃, 并不保证你调用的结果在不同版本的机器上一致. 关于如何优雅的组织代码, ViewCompat类的结构非常适合我们参考. ViewCompat里面定义了一个接口,

  • Android绘制验证码的实例代码

    在前面仿华为加载动画.仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制.在本例中,我们将绘制常见的验证码. 一.效果图 二.知识点与思路分析 通过上面的效果图观察,我们可以看到里面有绘制的随机线条,随机绘制的验证码. 绘制线条,直线或曲线 绘制文本,生成的验证码文本的绘制 绘制圆点. 三.代码编写 /** * Created by Iflytek_dsw on 2017/7/3. */ public class IdentifyCodeUtil { private sta

  • android绘制几何图形的实例代码

    本文实例为大家分享了android绘制几何图形展示的具体代码,供大家参考,具体内容如下 效果图: 代码(仅绘制类,不可直接运行): public class MyView extends View { public MyView(Context context, AttributeSet set) { super(context, set); } @Override // 重写该方法,进行绘图 protected void onDraw(Canvas canvas) { super.onDraw

  • Android栗子の图片验证码生成实例代码

    废话不多说了,下面一段代码给大家分享android 生成栗子图片验证码功能,具体代码如下所示: 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

  • Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_test.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja

  • Android 画一个太极图实例代码

    今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

  • JAVA验证码工具实例代码

    工具类: package com.lhy.web.servlet; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import

  • AngularJS 实现点击按钮获取验证码功能实例代码

    html :样式采用了sui框架的样式,请自行引入查看,AngularJS,自己引入, <div ng-controller="forGetPassword" ng-app="routingDemoApp"> <form novalidate name="forget"> <header class="bar bar-nav"> <a href="javascript:his

  • Web制作验证码功能实例代码

    web开发中,经常会使用验证码功能,例如登录.注册,或其他关键功能之前经常会使用.合理使用 验证功能可以防止ddos攻击.爬虫攻击等.   实现效果:   实现原理: 由后台提供生成验证码的接口,前端每次请求会后端会生成验证码图片和验证码,验证码图片发送到客户端供客户端显示, 验证码字符串保存再后端的Session中,待前端再次请求业务接口与session里的验证码字符串做比对.    实现思路: 1.先由后端提供可以生产验证码图片的接口 2.前端通过 img 中设置 src 属性,请求验证码生

  • Android 获取屏幕尺寸实例代码

    Android 获取屏幕尺寸实例代码 实现代码: /** * <supports-screens * android:smallScreens="true" * android:normalScreens="true" * android:largeScreens="true" * android:resizeable="true" * android:anyDensity="true" />

  • Android字段验证的实例代码

    先给大家展示效果图: package com.example.walkerlogin1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widge

随机推荐