才刚刚开始写这种自定义控件,但是发现验证码完全可以不用自定义控件,自定义控件好像麻烦点,下面就来介绍了使用bitmap的形式显示验证码

这个起初我也不会,都是看大神们弄的, 我也就添了点东西,让验证码更多样,哈哈,废话不多说,上交代码了

第一步 ,创建一个类

  1 public class CodeBitmap {
  2
  3
  4     //随机数数组
  5     private static final char[] CHARS = {
  6             '2', '3', '4', '5', '6', '7', '8', '9',
  7             'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
  8             'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  9             'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
 10             'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
 11     };
 12     //padding值
 13     private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 30, RANGE_PADDING_TOP = 20;
 14     //random word space and pading_top
 15     private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
 16             base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;
 17     private Random random = new Random();
 18     private String returncode;
 19     private int painsize=40;
 20 //线条数
 21     int line_number=5;
 22     private int padding_left, padding_top;
 23     private static CodeBitmap bmpCode;
 24     public static CodeBitmap getInstance() {
 25         if(bmpCode == null)
 26             bmpCode = new CodeBitmap();
 27         return bmpCode;
 28     }
 29     //验证码图片
 30     public Bitmap cratebitmap(int width,int height) {
 31         padding_left = 0;
 32         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
 33         Canvas canvas = new Canvas(bitmap);
 34         //创建验证码
 35         returncode = crateCode();
 36         canvas.drawColor(Color.WHITE);
 37
 38         Paint paint=new Paint();
 39         paint.setAntiAlias(true);
 40         paint.setTextSize(painsize);
 41
 42         //画验证码
 43         for (int i=0;i<returncode.length();i++) {
 44             randomTextStyle(paint);
 45             randomPadding();
 46             canvas.drawText(returncode.charAt(i) + "", padding_left, padding_top, paint);
 47         }
 48         //画线条
 49         for (int i = 0; i < line_number; i++) {
 50             drawLine(canvas, paint,width,height);
 51         }
 52
 53         //画小圆点
 54         for (int i=0;i<20;i++){
 55            drawpoint(canvas,paint,width,height);
 56         }
 57         canvas.save( Canvas.ALL_SAVE_FLAG );//保存
 58         canvas.restore();//
 59         return bitmap;
 60     }
 61
 62     //画干扰线
 63     private void drawLine(Canvas canvas, Paint paint,int width,int height) {
 64         int color = randomColor();
 65         int startX = random.nextInt(width);
 66         int startY = random.nextInt(height);
 67         int stopX = random.nextInt(width);
 68         int stopY = random.nextInt(height);
 69         paint.setStrokeWidth(1);
 70         paint.setColor(color);
 71         canvas.drawLine(startX, startY, stopX, stopY, paint);
 72     }
 73     //画圆dian
 74     private void drawpoint(Canvas canvas, Paint paint,int width,int height){
 75         int color = randomColor();
 76         paint.setStrokeWidth(1);
 77         paint.setColor(color);
 78         int[] rang=getPoint(height,width);
 79         canvas.drawCircle(rang[0], rang[1],random.nextInt(5),paint);
 80     }
 81     // 随机产生点的圆心点坐标
 82     public static int[] getPoint(int height, int width) {
 83         int[] tempCheckNum = { 0, 0, 0, 0 };
 84         tempCheckNum[0] = (int) (Math.random() * width);
 85         tempCheckNum[1] = (int) (Math.random() * height);
 86         return tempCheckNum;
 87     }
 88     //随机生成文字样式,颜色,粗细,倾斜度
 89     private void randomTextStyle(Paint paint) {
 90         int color = randomColor();
 91         paint.setColor(color);
 92         paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体
 93         float skewX = random.nextInt(11) / 10;
 94         skewX = random.nextBoolean() ? skewX : -skewX;
 95         paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
 96         //paint.setUnderlineText(true); //true为下划线,false为非下划线
 97         //paint.setStrikeThruText(true); //true为删除线,false为非删除线
 98     }
 99     //随机生成颜色
100     private int randomColor() {
101         return randomColor(1);
102     }
103
104     private int randomColor(int rate) {
105         int red = random.nextInt(256) / rate;
106         int green = random.nextInt(256) / rate;
107         int blue = random.nextInt(256) / rate;
108         return Color.rgb(red, green, blue);
109     }
110     //随机生成padding值
111     private void randomPadding() {
112         padding_left += base_padding_left + random.nextInt(range_padding_left);
113         padding_top = base_padding_top + random.nextInt(range_padding_top);
114     }
115     //生成验证码
116     private String crateCode() {
117         StringBuffer returnbf = new StringBuffer();
118         for (int i = 0; i < 4; i++) {
119             returnbf.append(CHARS[random.nextInt(CHARS.length)]);
120         }
121         return returnbf.toString();
122     }
123
124     //获取验证码的值
125     public String getcode(){
126         return returncode;
127     }
128 }

第二步,调取类中cratebitmap的方法,显示图片就可以啦

先看mainactivity布局

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:orientation="vertical" >
 5
 6     <LinearLayout
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:layout_marginLeft="15dp"
10         android:layout_marginRight="15dp"
11         android:layout_marginTop="20dp"
12         android:orientation="horizontal" >
13         <LinearLayout
14             android:layout_width="wrap_content"
15             android:layout_height="40dp"
16             >
17             <EditText
18                 android:id="@+id/et_phoneCodes"
19                 android:layout_width="match_parent"
20                 android:layout_height="match_parent"
21                 android:layout_marginLeft="10dp"
22                 android:layout_marginRight="10dp"
23                 android:background="@null"
24                 android:hint="请输入右侧验证码" />
25         </LinearLayout>
26
27         <ImageView
28             android:id="@+id/iv_showCode"
29             android:layout_width="120dp"
30             android:layout_marginLeft="10dp"
31             android:layout_height="60dp" />
32
33     </LinearLayout>
34
35     <Button
36         android:id="@+id/but_forgetpass_toSetCodes"
37         android:layout_width="match_parent"
38         android:layout_height="wrap_content"
39         android:layout_margin="20dp"
40         android:text="验        证"
41       />
42
43 </LinearLayout>

再看看mainActivity

 1 public class MainActivity extends AppCompatActivity {
 2
 3     private Button button;
 4     private EditText dode;
 5     private ImageView iv_showCode;
 6     private String realcode;
 7     //设置图片大小
 8     private static final int DEFAULT_WIDTH = 120, DEFAULT_HEIGHT = 60;
 9     private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14         initview();
15     }
16     private void initview(){
17         button = (Button) findViewById(R.id.but_forgetpass_toSetCodes);
18         dode = (EditText)findViewById(R.id.et_phoneCodes);
19         iv_showCode = (ImageView)findViewById(R.id.iv_showCode);
20         iv_showCode.setImageBitmap(CodeBitmap.getInstance().cratebitmap(width,height));
21         realcode = CodeBitmap.getInstance().getcode().toLowerCase();
22         iv_showCode.setOnClickListener(new View.OnClickListener() {
23             @Override
24             public void onClick(View v) {
25                 iv_showCode.setImageBitmap(CodeBitmap.getInstance().cratebitmap(width,height));
26                 realcode = CodeBitmap.getInstance().getcode().toLowerCase();
27             }
28         });
29         button.setOnClickListener(new View.OnClickListener() {
30             @Override
31             public void onClick(View v) {
32                 String editcode=dode.getText().toString().trim();
33                 if (editcode.equals(realcode)){
34                     Toast.makeText(MainActivity.this,"验证码输入正确!",Toast.LENGTH_SHORT).show();
35                 }else {
36                     Toast.makeText(MainActivity.this,"验证码错误,请重新输入!",Toast.LENGTH_SHORT).show();
37                 }
38             }
39         });
40     }
41 }

转载于:https://www.cnblogs.com/wangying222/p/6116285.html

验证码颜色、字母、数字、线条、圆点、位置都随机,点击切换验证码相关推荐

  1. Vue项目实战09 : vue3.0实现点击切换验证码(组件)及校验

    博主博客: https://lvsige.top/ 先看效果 父组件 <template><div class="login"><van-fieldc ...

  2. 问答项目---登陆验证码点击切换及异步验证验证码

    输出验证方法: public function verify(){$config = array('length' => 2,'reset' => false,'useCurve' =&g ...

  3. 字母数字、字母、汉字验证码 (java)

    一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com.soufun; import java.awt.Color; import java.awt.Font; imp ...

  4. html获取随机字母,html5 canvas随机生成英文字母数字组合图片验证码代码

    简单又实用的html5 canvas随机生成英文字母数字组合图片验证码代码,点击验证码图片可更换一组,还可随意修改验证码的内容,样式. 查看演示 下载资源: 27 次 下载资源 下载积分: 20 积分 ...

  5. PHP字母数字验证码和中文验证码

    1:字母数字组合的验证码 HTML代码: 1 验证码:<input type="text" name="code"> 2 <img oncli ...

  6. ASP.NET 验证码 攻略,支持中文,字母,数字

    做登录界面难免要做验证码,今天我就做了一个,后来索性做了一个全的,支持中英文(其它字符也是可以得). 验证码原理: 图片生成: 首先创建一种Bitmap,然后给这张图片加背景色,加验证码,加噪音.其中 ...

  7. 利用深度学习(CNN)进行验证码(字母+数字)识别

    利用深度学习(CNN)进行验证码(字母+数字)识别_helen1313的专栏-CSDN博客 本文方法针对的验证码为定长验证码,不包含中文. 本文的思路是:1. 使用keras中预训练好的模型,在pyt ...

  8. jQuery+CSS五类验证码(字母、数字、滑动、点击)

    用到了js插件 <!DOCTYPE html> <html><head><meta charset="utf-8" /><li ...

  9. java五位随机验证码的实现。要求前四位是随机大小写的字母,最后一位是数字的组合。例如qWrY4

    package Test; import java.util.Random; public class Test1 {     public static void main(String[] arg ...

最新文章

  1. OpenAI解散机器人团队,曾试图造AGI机器人,创始人:最好的决定
  2. php 图片处理类,分享php多功能图片处理类
  3. 【转载】从30岁到35岁,为你的生命多积累一些厚度
  4. ASP.NET操作Excel(终极方法NPOI)
  5. MySQL重安装,安装到最后出现Er1045的解决方法
  6. 【SSH网上商城】struts搭建及实例
  7. Hamilton四元数
  8. 干货 | 一文轻松了解NLP所有相关任务简介!
  9. mac XAMPP环境下, 使用php函数mkdir()添加新目录(文件)报错,报错信息:permission denied;...
  10. HDFS常用命令与命令大全及其用法
  11. ios12完美深色模式插件_苹果针对老机型推送iOS12.4.6iOS14代码泄漏iPhone12:无刘海真全面屏...
  12. android x86 ib,IB驱动安装
  13. 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
  14. 沙场已无李世鹤:论TD-LTE专利
  15. 三菱FX系列控制步进电机回原点方向
  16. 计算机二级MS office高级应用考试笔记攻略(完整-知识点)
  17. 自由 stm32f103c8t6芯片学习原理图+中文数据手册pdf
  18. 分享一个强大无痛的英语学习网站
  19. 服务器项目报备什么意思,报备项目是什么意思
  20. 教你如何解析eth的区块信息,并保存所有的交易记录

热门文章

  1. Linux按键驱动,中断实现流程
  2. android 升级数据库 修改表结构
  3. 《AFTrans》来自ViT的免费午餐!北大阿里提出用于细粒度视觉识别的自适应注意多尺度融合Transformer...
  4. 不得不赞!京东开源FaceX-Zoo,一站式人脸识别研究平台
  5. 大量CV职位!奥比中光2020届校招提前批内推启动!
  6. CVPR 2019 | 告别低分辨率网络,微软提出高分辨率深度神经网络HRNet
  7. 工程院院士李国杰科学网发文称国内 AI 研究「顶不了天,落不了地」
  8. 刚刚!2020“中国高被引学者” 榜单发布:清华、北大、浙大位居内地前三!
  9. 内推!美团2021届应届生补招与2022届实习生招聘同步开启
  10. 经验 | 如何提升目标检测NMS精度