暑假的班级项目登录界面用到了验证码,就想着简单点弄个图片验证码好了。看了几篇文章还是有点儿懵。然后耐着性子把一篇关于验证码的文章分析了一下。果然还是得有耐心才行啊。 ╰( ̄ω ̄o)

虽然大致是做出来了,但是还有个小bug,就是文字会出界的问题,如果有更好的解决方案的,欢迎提出呀!(~o ̄3 ̄)

大概是参照这篇博客的:https://blog.csdn.net/wk843620202/article/details/50960904

先上效果图

然后,我们先从布局文件开始

因为主要是看验证码,布局部分我就只截取那一行的代码了

<LinearLayoutandroid:layout_width="wrap_content"android:layout_height="45dp"android:layout_marginTop="10dp"android:layout_marginLeft="20dp"android:layout_gravity="center_horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"><EditTextandroid:id="@+id/identifyingcode_edittext"android:layout_width="100dp"android:layout_height="match_parent"android:hint="验证码"android:maxLength="4"android:textColor="#4e4e4e"android:textSize="20sp" /></LinearLayout><!--这里预留一个ImageView来放图形验证码--><ImageViewandroid:id="@+id/identifyingcode_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"/></LinearLayout>

接下来就是一个专门产生图形验证码的类了。首先我们新建一个类(在这里我取名IdentifyingCode)

package util;import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;import java.util.Random;/*** @author jiaru* 这个类用来生成验证码*/
public class IdentifyingCode {//随机数数组,验证码上的数字和字母private static final char[] CHARS={'0','1','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 IdentifyingCode IdentifyingCode;public static IdentifyingCode getInstance(){if(IdentifyingCode==null){IdentifyingCode=new IdentifyingCode();}return IdentifyingCode;}//验证码个数private static final int CODE_LENGTH = 4;//字体大小private static final int FONT_SIZE = 50;//线条数private static final int LINE_NUMBER = 5;//padding,其中base的意思是初始值,而range是变化范围。数值根据自己想要的大小来设置private static final int BASE_PADDING_LEFT=10,RANGE_PADDING_LEFT=100,BASE_PADDING_TOP=75,RANGE_PADDING_TOP=50;//验证码默认宽高private static final int DEFAULT_WIDTH=400,DEFAULT_HEIGHT=150;//画布的长宽private int width=DEFAULT_WIDTH,height=DEFAULT_HEIGHT;//字体的随机位置private int base_padding_left=BASE_PADDING_LEFT,range_padding_left=RANGE_PADDING_LEFT,base_padding_top=BASE_PADDING_TOP,range_padding_top=RANGE_PADDING_TOP;//验证码个数,线条数,字体大小private int codeLength=CODE_LENGTH,line_number=LINE_NUMBER,font_size=FONT_SIZE;private String code;private int padding_left,padding_top;private Random random=new Random();//验证码图片(生成一个用位图)public Bitmap createBitmap(){padding_left=0;padding_top=0;//创建指定格式,大小的位图//Config.ARGB_8888是一种色彩的存储方法Bitmap bp=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);Canvas c=new Canvas(bp);code =createCode();//将画布填充为白色c.drawColor(Color.WHITE);//新建一个画笔Paint paint =new Paint();//设置画笔抗锯齿paint.setAntiAlias(true);paint.setTextSize(font_size);//在画布上画上验证码
//        Paint.FontMetrics fontMetrics = paint.getFontMetrics();for(int i=0;i<code.length();i++){randomTextStyle(paint);randomPadding();//这里的padding_left,padding_top是文字的基线    c.drawText(code.charAt(i)+"",padding_left,padding_top,paint);}//画干扰线for(int i = 0;i<line_number;i++){drawLine(c,paint);}//保存一下画布c.save();c.restore();return bp;}//生成验证码private String createCode(){StringBuilder sb=new StringBuilder();//利用random生成随机下标for(int i=0;i<codeLength;i++){sb.append(CHARS[random.nextInt(CHARS.length)]);}return sb.toString();}//画线private void drawLine(Canvas canvas,Paint paint){int color=randomColor();int startX=random.nextInt(width);int startY=random.nextInt(height);int stopX=random.nextInt(width);int stopY=random.nextInt(height);paint.setStrokeWidth(1);paint.setColor(color);canvas.drawLine(startX,startY,stopX,stopY,paint);}//随机文字样式,颜色,文字粗细与倾斜度private void randomTextStyle(Paint paint){int color=randomColor();paint.setColor(color);paint.setFakeBoldText(random.nextBoolean());//true为粗体,false为非粗体double skew =random.nextInt(11)/10;//随机ture或者false来生成正数或者负数,来表示文字的倾斜度,负数右倾,正数左倾skew=random.nextBoolean()?skew:-skew;//   paint.setUnderlineText(true);//下划线// paint.setStrikeThruText(true);//删除线}//生成随机颜色,利用RGBprivate int randomColor(){return randomColor(1);}private int randomColor(int rate){int red=random.nextInt(256)/rate;int green=random.nextInt(256)/rate;int blue = random.nextInt(256)/rate;return Color.rgb(red,green,blue);}//验证码位置随机private void randomPadding(){padding_left+=base_padding_left+random.nextInt(range_padding_left);padding_top=base_padding_top+random.nextInt(range_padding_top);}public String getCode(){return code;}
}

大致的内容我都在注释里讲了。这个生成验证码,主要是将一个位图放在ImageView中,然后用画布将验证码以及干扰线画上去,你也可以设置下划线或者删除线。

然后一开始我发现,我点了几次验证码后,验证码图片会出现,没有了文字的情况,考虑到应该是文字出界了。因为Canvas画文字有基线的,因此,我们只要保证验证码的中心坐标,是依次从左到右,而每个字的y坐标不定,就可以做出,文字在上蹿下跳的效果。

因此作为基线的padding_left,是从base_padding_left依次增加的。而每次增加的幅度,由random随机产生。最大幅度由range_padding_left控制。

而padding_top,因为是可以上上下下,但是,注意不能出界。所以不是padding_top+=base_padding_top+幅度,而是=;也就是说,从左到右,不是依次往下降的,而是上蹿下跳的。这样只要控制base_padding_top和range_padding_top就不会出界了。(其实有更准确的方法的,但是我没有深究下去,文末会附上参考博客,有兴趣的同学研究一下咯)

好,那么,接下来就是怎么用这个类啦!

其实只需要,在activity中,定义一个ImageView对象,然后绑定布局中的ImageView,就可以调用IdentifyingCode中的方法来创建一个验证码啦。

然后给这个ImageView设一个监听,就可以点击这个验证码就换一次图片啦!

        private ImageView identifyingCode;//这里是初始化并设置监听,记得要保存对的验证码,用来验证后面用户输入的对不对identifyingCode=(ImageView)findViewById(R.id.identifyingcode_image);identifyingCode.setOnClickListener(this);identifyingCode.setImageBitmap(IdentifyingCode.getInstance().createBitmap());realCode=IdentifyingCode.getInstance().getCode().toLowerCase();

然后在OnClick那里,再来这两个语句,就做到可以刷新验证码了。( ̄︶ ̄)↗ 

       identifyingCode.setImageBitmap(IdentifyingCode.getInstance().createBitmap());realCode=IdentifyingCode.getInstance().getCode().toLowerCase();

就这样,一个五颜六色的验证码,就完成了。

参考博客:

  1. android随机生成验证码https://blog.csdn.net/wk843620202/article/details/50960904
  2. bitMap的介绍以及他与Canvas的关联https://www.cnblogs.com/jenson138/p/4302073.html
  3. Canvas的介绍https://www.cnblogs.com/huolongluo/p/5797766.html
  4. 画笔Paint的介绍以及他与Canvas的联系https://blog.csdn.net/sinat_35762047/article/details/54965298#一paint和canvas
  5. 里面出现到的Config又是什么呢?https://blog.csdn.net/u010885095/article/details/44938875
  6. 在Canvas上画文字,这里有涉及文字出界内容https://blog.csdn.net/osle123/article/details/52756696
  7. 关于Canvas的drawTexthttps://blog.csdn.net/zly921112/article/details/50401976

Android生成简单的图片验证码相关推荐

  1. php设计验证码图片,php实现简单的图片验证码

    这是最简单的图片验证码: image.php header("Content-type: image/png"); $string = "abcdefghijklmnop ...

  2. eoLinker-API_Shop_验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等...

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  3. 随机生成6位图片验证码

    1. [代码][C#]代码  /// <summary>     /// PicHandler1 的摘要说明     /// </summary>     public cla ...

  4. Android开发—简单的图片浏览器

    开发工具:ecplise 图片浏览器:实现简单的图片浏览功能,点击当前图片会自动切换到下一张图片 1.先在布局文件中定义一个简单的线性布局容器 <?xml version="1.0&q ...

  5. android生成大分辨率图片,自动生成Android不同分辨率下的图片

    转自: http://blog..net/offbye/article/details/50012605 Android屏幕分辨率适配的图标处理比较麻烦,让UI做不同尺寸的图片也挺浪费时间的,并且容易 ...

  6. phpgif图片包_PHP生成GIF动态图片验证码

    1 <?php2 /**3 * 调用示例4 **/ 5 session_start();6 $randCode = '';7 //验证码随机 8 $str="abcdefghjkmnp ...

  7. Android自定义简单的图片加载器(ImageLoader)

    废话不多述,首先来说明下 为什么要用图片加载器 呢,就是为了避免图片重复从网络加载.也就是在第一次从网络加载之后就把图片缓存在本地,下次用的时候直接从本地查找,有的话就直接用,没有再从网络加载. 加载 ...

  8. 用JS实现简单的图片验证码

    文章目录 HTML主要代码 JS 代码 HTML主要代码 JS 代码 先准备数字0-9的十张图片 let n, img = "", s = "" const a ...

  9. php 简单图片验证码,PHP 实现简单图片验证码

    验证码是网站会员系统中不可缺少的,目前验证码有很多种,但用的比较多的还是图片验证码,这里就用面向对象的方式来简单实现图片验证码, 注意!我这里使用的是 PHP 的 gd 库,如果要查看是否启用了 gd ...

最新文章

  1. php 上下位置居中,CSS_css中position:fixed实现div在窗口上下左右居中,上下左右 居中 代码如下 复制 - phpStudy...
  2. 红黑树 键值_查找(一)史上最简单清晰的红黑树讲解
  3. the serveice mysql_解决重启MySQL数据库The server quit without updating PID file问题
  4. WARNING: The host '$hostname' could not be looked up with resolveip. (转)
  5. IBASE component删除出错
  6. php能转换音频采样率吗,音频采样频率怎么设置-音频采样率转换软件下载
  7. project不显示里程碑标志_在Project中设置里程碑
  8. linux aio拷贝文件,Linux通过AIO进行异步读文件
  9. arcgis合并tif影像_ARCGIS多种影像裁剪
  10. InnoDB存储引擎--学习笔记-redo log
  11. 汽车产业与技术链分析
  12. ssh autologin REMOTE HOST IDENTIFICATION HAS CHANGED处理
  13. 搜狗实验室新闻数据文本分类深度学习案例 ———Tensorflow+CNN深度学习全流程(上)
  14. VC中GetLastError() 错误代码的含义
  15. 镜像分发工具压测解决方案——hijack压测
  16. html设置图片为黑白,CSS 将彩色图片转换成黑白图片
  17. 电脑登录宽带怎么自动连接服务器地址,宽带自动连接怎么设置
  18. 杭州网侠大会及JavaEye会员聚会照片
  19. CSP-S 蒟蒻啊qaq
  20. 一度智信:拼多多怎么投诉商家

热门文章

  1. NPR-Hatching素描渲染
  2. Java毕业设计-企业招聘管理系统
  3. Media Playback
  4. 2022年,哪些AI方向还能卷出创新点?(NLP版)
  5. CentOS挂载U盘拷贝文件
  6. C# 使用Xunit 框架进行代码测试
  7. 微软面试100题2010年版全部答案集锦(含下载地址)
  8. 2022-2028全球自动车道警告系统行业调研及趋势分析报告
  9. simulink封装子系统(mask subsystem)车道保持辅助系统曲率预览器封装
  10. 从知识到财富:为何知识管理掀起了企业管理的新趋势?