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.