androidstudio实现图形验证码

androidstudio实现图形验证码



xml文件:

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal">

        android:id="@+id/et_loginactivity_phoneCodes"

        android:layout_width="80dp"

        android:layout_height="50dp"

        android:layout_marginLeft="50dp"

        android:layout_marginRight="10dp"

        android:layout_marginTop="20dp"

        android:layout_weight="3"

        android:hint="请输入四位验证"

        android:textColor="#000000"

        android:textColorHint="#bcbcbc" />

        android:id="@+id/iv_loginactivity_showCode"

        android:layout_width="95dp"

        android:layout_height="63dp"

        android:layout_marginTop="10dp"

        android:layout_weight="1.5"

        android:clickable="true"

        />


java文件:

(主活动代码)

private EditTextmEtloginactivityPhonecodes;

private ImageViewmIvloginactivityShowcode;

private StringrealCode;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mEtloginactivityPhonecodes = findViewById(R.id.et_loginactivity_phoneCodes);

    mIvloginactivityShowcode = findViewById(R.id.iv_loginactivity_showCode);

    mIvloginactivityShowcode.setImageBitmap(code.getInstance().createBitmap());

    realCode = code.getInstance().getCode().toLowerCase(); //将验证码用图片的形式显示出来

    mIvloginactivityShowcode.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            mIvloginactivityShowcode.setImageBitmap(code.getInstance().createBitmap());

            realCode = code.getInstance().getCode().toLowerCase(); //将验证码用图片的形式显示出来

        }

    });

    login.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            String phoneCode =mEtloginactivityPhonecodes.getText().toString().toLowerCase();

                if(phoneCode.length()==0){

                    Toast.makeText(MainActivity.this,"验证码不能为空",Toast.LENGTH_SHORT).show();

                }             

                else if (!phoneCode.equals(realCode)){

                    Toast.makeText(MainActivity.this,"验证码错误",Toast.LENGTH_SHORT).show();

                }

        }

    });

}


(随机生成图形验证码)

package com.example.smartcommunityv2;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import java.util.Random;

public class code {

/**

    * 随机数数组

    * 去除了易混淆的 数字 0 和 字母 o O

    *                数字 1 和 字母 i I l L

    *                数字 6 和 字母 b

    *                数字 9 和 字母 q

    *                字母 c C 和 G

    *                字母 t (经常和随机线混在一起看不清)

    */

    private static final char[]CHARS = {

'2', '3', '4', '5',  '7', '8',

            'a',  'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',

            'n', 'p',  'r', 's',  'u', 'v', 'w', 'x', 'y', 'z',

            'A', 'B',  'D', 'E', 'F',  'H',  'J', 'K', 'M',

            'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'

    };

    private static codebmpCode;

    public static codegetInstance() {

if(bmpCode ==null)

bmpCode =new code();

        return bmpCode;

    }

//default settings

    //验证码默认随机数的个数

    private static final int DEFAULT_CODE_LENGTH =4;

    //默认字体大小

    private static final int DEFAULT_FONT_SIZE =25;

    //默认线条的条数

    private static final int DEFAULT_LINE_NUMBER =5;

    //padding值

    private static final int BASE_PADDING_LEFT =10, RANGE_PADDING_LEFT =15, BASE_PADDING_TOP =15, RANGE_PADDING_TOP =20;

    //验证码的默认宽高

    private static final int DEFAULT_WIDTH =100, DEFAULT_HEIGHT =40;

    //settings decided by the layout xml

//canvas width and height

    private int width =DEFAULT_WIDTH, height =DEFAULT_HEIGHT;

    //random word space and pading_top

    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;

    //number of chars, lines; font size

    private int codeLength =DEFAULT_CODE_LENGTH, line_number =DEFAULT_LINE_NUMBER, font_size =DEFAULT_FONT_SIZE;

    //variables

    private Stringcode;

    private int padding_left, padding_top;

    private Randomrandom =new Random();

    //验证码图片

    public BitmapcreateBitmap() {

padding_left =0;

        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);

        //画验证码

        for (int i =0; i

randomTextStyle(paint);

            randomPadding();

            c.drawText(code.charAt(i) +"", padding_left, padding_top, paint);

        }

//画线条

        for (int i =0; i

drawLine(c, paint);

        }

//        c.save( Canvas.ALL_SAVE_FLAG );//保存

        c.save();//保存

        c.restore();//

        return bp;

    }

public StringgetCode() {

return code;

    }

//生成验证码

    private StringcreateCode() {

StringBuilder buffer =new StringBuilder();

        for (int i =0; i

buffer.append(CHARS[random.nextInt(CHARS.length)]);

        }

return buffer.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 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 randomTextStyle(Paint paint) {

int color = randomColor();

        paint.setColor(color);

        paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体

        float skewX =random.nextInt(11) /10;

        skewX =random.nextBoolean() ? skewX : -skewX;

        paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜

        //paint.setUnderlineText(true); //true为下划线,false为非下划线

        //paint.setStrikeThruText(true); //true为删除线,false为非删除线

    }

//随机生成padding值

    private void randomPadding() {

padding_left +=base_padding_left +random.nextInt(range_padding_left);

        padding_top =base_padding_top +random.nextInt(range_padding_top);

    }

}

你可能感兴趣的:(androidstudio实现图形验证码)