XML设置:
首先就是点击xml,然后初始化一下父容器,可以这样写
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
</RelativeLayout>
然后添加Image,button,exittext这三个控件js
<ImageView
android:id="@+id/image_captcha"
android:layout_width="200dp"
android:layout_height="80dp"
android:layout_alignBottom="@+id/edit_captcha"
android:layout_marginTop="20dp"
android:layout_marginBottom="-154dp" />
<EditText
android:id="@+id/edit_captcha"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" />
<Button
android:id="@+id/button_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/edit_captcha"
android:layout_alignParentEnd="true"
android:layout_marginTop="20dp"
android:layout_marginEnd="83dp"
android:layout_marginBottom="-133dp"
android:text="验证" />
Java文件编辑
package com.example.ty_world;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private ImageView captchaImage;
private EditText captchaText;
private Button checkButton;
private String generatedCaptcha;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
captchaImage = findViewById(R.id.image_captcha);
captchaText = findViewById(R.id.edit_captcha);
checkButton = findViewById(R.id.button_check);
// 生成验证码
generatedCaptcha = generateCaptcha();
Bitmap captchaBitmap = generateCaptchaBitmap(generatedCaptcha);
captchaImage.setImageBitmap(captchaBitmap);
checkButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String inputCaptcha = captchaText.getText().toString().trim();
// 验证输入的验证码
if (inputCaptcha.equalsIgnoreCase(generatedCaptcha)) {
Toast.makeText(MainActivity.this, "验证码正确", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();
}
}
});
captchaImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 重新生成验证码并更新界面
generatedCaptcha = generateCaptcha();
Bitmap captchaBitmap = generateCaptchaBitmap(generatedCaptcha);
captchaImage.setImageBitmap(captchaBitmap);
// 清空文本框内容
captchaText.setText("");
}
});
}
// 生成随机的4个字母验证码
private String generateCaptcha() {
Random random = new Random();
StringBuilder captchaBuilder = new StringBuilder();
for (int i = 0; i < 4; i++) {
char c = (char) (random.nextInt(26) + 'A');
captchaBuilder.append(c);
}
return captchaBuilder.toString();
}
// 生成验证码对应的Bitmap图片
// 生成验证码对应的Bitmap图片
private Bitmap generateCaptchaBitmap(String captcha) {
int width = 200;
int height = 80;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(Color.WHITE);
canvas.drawRect(0, 0, width, height, backgroundPaint);
// 添加干扰线
Paint linePaint = new Paint();
linePaint.setColor(Color.GRAY);
linePaint.setStrokeWidth(2f);
Random random = new Random();
for (int i = 0; i < 5; i++) {
int startX = random.nextInt(width);
int startY = random.nextInt(height);
int endX = random.nextInt(width);
int endY = random.nextInt(height);
canvas.drawLine(startX, startY, endX, endY, linePaint);
}
// 添加文本
Paint textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(48f);
Random angleRandom = new Random();
for (int i = 0; i < captcha.length(); i++) {
char c = captcha.charAt(i);
float x = (width / captcha.length()) * i + 20f;
float y = height / 2 - (textPaint.ascent() + textPaint.descent()) / 2;
// 随机生成字母的旋转角度
float angle = angleRandom.nextInt(40) - 15; // 可以根据需要修改角度范围
// 随机生成字母的颜色
int color = Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256));
textPaint.setColor(color);
canvas.rotate(angle, x, y);
canvas.drawText(String.valueOf(c), x, y, textPaint);
canvas.rotate(-angle, x, y);
}
return bitmap;
}
}