Android login graphic verification code generation

activity_main.xml 
layout code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context="${relativePackage}.${activityClass}" >  

    <LinearLayout   
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:layout_marginLeft="10dp"  
        android:orientation="vertical">  
        <ImageView   
            android:id="@+id/image"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:src="@drawable/ic_launcher"/>  
        <EditText   
            android:id="@+id/et"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:hint="Enter verification code"/>  
        <Button   
            android:id="@+id/btn"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:text="Get verification code"/>  
        <Button   
            android:id="@+id/btn_submit"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:text="Submit"/>  
    </LinearLayout>  

</RelativeLayout>  

 mainactivity code:

package com.example.codedemo;  

import android.app.Activity;  
import android.graphics.Bitmap;  
import android.os.Bundle;  
import android.text.TextUtils;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.ImageView;  
import android.widget.Toast;  

public class MainActivity extends Activity implements OnClickListener {  

    private ImageView image;  
    private EditText et;  
    private Button btn,submit;  
    private String codeStr;  
    private CodeUtils codeUtils;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate (savedInstanceState);  
        setContentView(R.layout.activity_main);  

        initView();  

    }  

    private void initView() {  
        image = (ImageView) findViewById(R.id.image);  
        et = (EditText) findViewById(R.id.et);  
        btn = (Button) findViewById(R.id.btn);  
        submit = (Button) findViewById(R.id.btn_submit);  
        btn.setOnClickListener(this);  
        submit.setOnClickListener(this);  

    }  

    @Override  
    public void onClick(View v) {  
        switch (v.getId()) {  
        case R.id.btn:  
            codeUtils = CodeUtils.getInstance();  
            Bitmap bitmap = codeUtils.createBitmap();  
            image.setImageBitmap(bitmap);  

            break;  
        case R.id.btn_submit:  
            codeStr = et.getText().toString().trim();  
            Log.e("codeStr", codeStr);  
            if (null == codeStr || TextUtils.isEmpty(codeStr)) {  
                Toast.makeText(this, "Please enter the verification code", 0).show();  
                return;  
            }  
            String code = codeUtils.getCode();  
            Log.e("code", code);  
            if (code.equalsIgnoreCase(codeStr)) {  
                Toast.makeText(this, "Verification code is correct", 0).show();  
            } else {  
                Toast.makeText(this, "Captcha error", 0).show();  
            }  
            break;  
        default:  
            break;  
        }  

    }  
}  

 Finally, attach the CodeUtils code:

package com.example.codedemo;  

import android.graphics.Bitmap;    
import android.graphics.Bitmap.Config;    
import android.graphics.Canvas;    
import android.graphics.Color;    
import android.graphics.Paint;    

import java.util.Random;    

/**  
 * Created by yao  
 * Tool class for image verification code  
 */    
public class CodeUtils {    
    private static final char[] CHARS = {    
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',    
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',    
            'n', 'o', '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', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'    
    };    

    private static CodeUtils mCodeUtils;    
    private int mPaddingLeft, mPaddingTop;    
    private StringBuilder mBuilder = new StringBuilder();    
    private Random mRandom = new Random();    

    //Default Settings    
    private static final int DEFAULT_CODE_LENGTH = 6;//The length of the verification code is 6 digits here    
    private static final int DEFAULT_FONT_SIZE = 60;//font size    
    private static final int DEFAULT_LINE_NUMBER = 3;//How many interference lines    
    private static final int BASE_PADDING_LEFT = 20; //Left margin    
    private static final int RANGE_PADDING_LEFT = 30;//Left margin range value    
    private static final int BASE_PADDING_TOP = 70;//Top margin    
    private static final int RANGE_PADDING_TOP = 15;//Top margin range value    
    private static final int DEFAULT_WIDTH = 300;//Default width. The total width of the picture    
    private static final int DEFAULT_HEIGHT = 100;//Default height. The total height of the picture    
    private static final int DEFAULT_COLOR = 0xDF;//Default background color value    

    private String code;  

    public static CodeUtils getInstance() {    
        if(mCodeUtils == null) {    
            mCodeUtils = new CodeUtils();    
        }    
        return mCodeUtils;    
    }    

    //generate verification code image    
    public Bitmap createBitmap() {    
        mPaddingLeft = 0; //Initialize each time a verification code image is generated    
        mPaddingTop = 0;    

        Bitmap bitmap = Bitmap.createBitmap(DEFAULT_WIDTH, DEFAULT_HEIGHT, Config.ARGB_8888);    
        Canvas canvas = new Canvas(bitmap);    

        code = createCode();    

        canvas.drawColor(Color.rgb(DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_COLOR));    
        Paint paint = new Paint();    
        paint.setTextSize(DEFAULT_FONT_SIZE);    

        for (int i = 0; i < code.length(); i++) {    
            randomTextStyle(paint);    
            randomPadding();    
            canvas.drawText(code.charAt(i) + "" , mPaddingLeft, mPaddingTop, paint);    
        }    

        //interference line    
        for (int i = 0; i < DEFAULT_LINE_NUMBER; i++) {    
            drawLine(canvas, paint);    
        }    

        canvas.save(Canvas.ALL_SAVE_FLAG);//保存    
        canvas.restore();    
        return bitmap;    
    }    
    /**
     * Get the verification code string in the picture
     * @return  
     */  
    public String getCode() {  
        return code;  
    }  

    //generate verification code    
    public String createCode() {    
        mBuilder.delete(0, mBuilder.length()); //Empty the content before use    

        for (int i = 0; i < DEFAULT_CODE_LENGTH; i++) {    
            mBuilder.append(CHARS[mRandom.nextInt(CHARS.length)]);    
        }    

        return mBuilder.toString();    
    }    

    //generate interference line    
    private void drawLine(Canvas canvas, Paint paint) {    
        int color = randomColor();    
        int startX = mRandom.nextInt(DEFAULT_WIDTH);    
        int startY = mRandom.nextInt(DEFAULT_HEIGHT);    
        int stopX = mRandom.nextInt(DEFAULT_WIDTH);    
        int stopY = mRandom.nextInt(DEFAULT_HEIGHT);    
        paint.setStrokeWidth(1);    
        paint.setColor(color);    
        canvas.drawLine(startX, startY, stopX, stopY, paint);    
    }    

    //random color    
    private int randomColor() {    
        mBuilder.delete(0, mBuilder.length()); //Empty the content before use    

        String haxString;    
        for (int i = 0; i < 3; i++) {    
            haxString = Integer.toHexString(mRandom.nextInt(0xFF));    
            if (haxString.length() == 1) {    
                haxString = "0" + haxString;    
            }    

            mBuilder.append(haxString);    
        }    

        return Color.parseColor("#" + mBuilder.toString());    
    }    

    // random text style    
    private void randomTextStyle(Paint paint) {    
        int color = randomColor();    
        paint.setColor(color);    
        paint.setFakeBoldText(mRandom.nextBoolean()); //true is bold, false is non-bold    
        float skewX = mRandom.nextInt(11) / 10;    
        skewX = mRandom.nextBoolean() ? skewX : -skewX;    
        paint.setTextSkewX(skewX); //float type parameter, negative number means right skew, integer left skew    
// paint.setUnderlineText(true); //true is underline, false is non-underline    
// paint.setStrikeThruText(true); //true is strikethrough, false is non strikethrough    
    }    

    // random spacing    
    private void randomPadding() {    
        mPaddingLeft += BASE_PADDING_LEFT + mRandom.nextInt(RANGE_PADDING_LEFT);    
        mPaddingTop = BASE_PADDING_TOP + mRandom.nextInt(RANGE_PADDING_TOP);    
    }    
}

 Among them, in Default Settings, you can set the size of the verification code graphic, the length of the verification code, the inner margin, the random distance, etc. can be adjusted as needed.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326219125&siteId=291194637