androidstudio實現(xiàn)圖形驗證碼

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

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舶担,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彬呻,更是在濱河造成了極大的恐慌衣陶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闸氮,死亡現(xiàn)場離奇詭異剪况,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒲跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門译断,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人或悲,你說我怎么就攤上這事孙咪。” “怎么了巡语?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵翎蹈,是天一觀的道長。 經(jīng)常有香客問我男公,道長杨蛋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任理澎,我火速辦了婚禮,結(jié)果婚禮上曙寡,老公的妹妹穿的比我還像新娘糠爬。我一直安慰自己,他們只是感情好举庶,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布执隧。 她就那樣靜靜地躺著,像睡著了一般户侥。 火紅的嫁衣襯著肌膚如雪镀琉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天蕊唐,我揣著相機(jī)與錄音屋摔,去河邊找鬼。 笑死替梨,一個胖子當(dāng)著我的面吹牛钓试,可吹牛的內(nèi)容都是我干的装黑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弓熏,長吁一口氣:“原來是場噩夢啊……” “哼恋谭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挽鞠,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤疚颊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后信认,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體材义,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年狮杨,在試婚紗的時候發(fā)現(xiàn)自己被綠了母截。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡橄教,死狀恐怖清寇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护蝶,我是刑警寧澤华烟,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站持灰,受9級特大地震影響盔夜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堤魁,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一喂链、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妥泉,春花似錦椭微、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刽沾,卻和暖如春本慕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侧漓。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工锅尘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人布蔗。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓鉴象,卻偏偏與公主長得像忙菠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纺弊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容