androidstudio實現(xiàn)圖形驗證碼
xml文件:
<LinearLayout
? ? 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"
? ? ? ? />
</LinearLayout>
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();
? ? ? ? ? ? ? ? }
????????}
????});
}
(隨機(jī)生成圖形驗證碼)
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 {
/**
? ? * 隨機(jī)數(shù)數(shù)組
? ? * 去除了易混淆的 數(shù)字 0 和 字母 o O
? ? *? ? ? ? ? ? ? ? 數(shù)字 1 和 字母 i I l L
? ? *? ? ? ? ? ? ? ? 數(shù)字 6 和 字母 b
? ? *? ? ? ? ? ? ? ? 數(shù)字 9 和 字母 q
? ? *? ? ? ? ? ? ? ? 字母 c C 和 G
? ? *? ? ? ? ? ? ? ? 字母 t (經(jīng)常和隨機(jī)線混在一起看不清)
? ? */
? ? 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
? ? //驗證碼默認(rèn)隨機(jī)數(shù)的個數(shù)
? ? private static final int DEFAULT_CODE_LENGTH =4;
? ? //默認(rèn)字體大小
? ? private static final int DEFAULT_FONT_SIZE =25;
? ? //默認(rèn)線條的條數(shù)
? ? 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;
? ? //驗證碼的默認(rèn)寬高
? ? 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);
? ? }
//生成隨機(jī)顏色
? ? 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);
? ? }
//隨機(jī)生成文字樣式痢士,顏色衡楞,粗細(xì)逊脯,傾斜度
? ? 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類型參數(shù),負(fù)數(shù)表示右斜饥努,整數(shù)左斜
? ? ? ? //paint.setUnderlineText(true); //true為下劃線浊吏,false為非下劃線
? ? ? ? //paint.setStrikeThruText(true); //true為刪除線,false為非刪除線
? ? }
//隨機(jī)生成padding值
? ? private void randomPadding() {
padding_left +=base_padding_left +random.nextInt(range_padding_left);
? ? ? ? padding_top =base_padding_top +random.nextInt(range_padding_top);
? ? }
}