Android实现图片验证码功能(超级简单)

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

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实获取验证码的功能需要用到 Android 中的计时器(CountDownTimer)和短信验证。以下是一种简单实现方式: 1. 在 XML 布局文件中添加一个按钮和一个 EditText,用于用户输入手机号码: ``` <EditText android:id="@+id/et_phone_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入手机号码"/> <Button android:id="@+id/btn_get_verification_code" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取验证码"/> ``` 2. 在 Activity 中找到这两个控件,并设置按钮的点击事件: ```java public class MainActivity extends AppCompatActivity { private EditText etPhoneNumber; private Button btnGetVerificationCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etPhoneNumber = findViewById(R.id.et_phone_number); btnGetVerificationCode = findViewById(R.id.btn_get_verification_code); // 设置按钮的点击事件 btnGetVerificationCode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取用户输入的手机号码 String phoneNumber = etPhoneNumber.getText().toString(); // TODO: 调用短信验证 API,发送验证码 // 启动倒计时器 startCountDown(); } }); } // 启动倒计时器 private void startCountDown() { // 创建一个计时器,设置时间间隔为 1 秒,总时间为 60 秒 CountDownTimer countDownTimer = new CountDownTimer(60000, 1000) { // 时间间隔结束调用的方法 @Override public void onTick(long millisUntilFinished) { // 更新按钮上的文字 btnGetVerificationCode.setText(millisUntilFinished / 1000 + " 秒后重新发送"); // 禁用按钮 btnGetVerificationCode.setEnabled(false); } // 总时间结束调用的方法 @Override public void onFinish() { // 更新按钮上的文字 btnGetVerificationCode.setText("获取验证码"); // 启用按钮 btnGetVerificationCode.setEnabled(true); } }; // 启动计时器 countDownTimer.start(); } } ``` 注意:上述代码中关于短信验证的部分需要自己调用相应的 API 实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值