原理
定义验证码内容由数字+字母组成 创建一个静态变量包含 ”0-9 a-z“
创建指定大小的bitmap 用于生成画板对象Canvas
使用Random 随机生成 三个255之内的数值 分别代表红 绿 蓝 生成 随机颜色
随机指定文本字体 生成验证码
接着用类似的方法生成 多条随机开始节点 和结束节点 连成的线
返回绘制的Bitmap
效果图
验证码.jpg
代码
class VerificationCodeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_verification_code)
imageview.setImageBitmap(MyUtils.GetRandomBitmap(300,150))
imageview.setOnClickListener {
imageview.setImageBitmap(MyUtils.GetRandomBitmap(300,150))
}
btn_ver.setOnClickListener {
Toast.makeText(this,
"验证结果 ${MyUtils.MyCurrentRandomString.equals(et_ver.text.toString().trim().toLowerCase())}",
Toast.LENGTH_LONG).show()
}
}
class MyUtils {
companion object{
var MyCurrentRandomString = ""
val RANDOM_CHARS = "1234567890qwertyuiopasdfghjklzxcvbnm"
fun GetRandomValdatorString():String{
var builder = StringBuilder()
for ( i in 0 until 4){
builder.append(RANDOM_CHARS.get( Random().nextInt(RANDOM_CHARS.length)) )
}
return builder.toString()
}
fun GetRandomBitmap(width:Int , height:Int):Bitmap{
var myBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888)
var myCanvas = Canvas(myBitmap)
var randomSrtring = GetRandomValdatorString()
MyCurrentRandomString = randomSrtring
myCanvas.drawColor(Color.WHITE)
var myPaint = Paint()
myPaint.textSize = 50f
//随机字体颜色
var color = Color.rgb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256))
myPaint.setColor(color)
//随机字体
myPaint.isFakeBoldText = Random().nextBoolean()
myCanvas.drawText(randomSrtring ,
(width/2-25* randomSrtring.length/2).toFloat(),
(height/2+25 * randomSrtring.length/4).toFloat(), myPaint)
// 绘制干扰线
for (i in 0..75){
var color = Color.rgb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256))
var startX = Random().nextInt(width)
var startY = Random().nextInt(height)
var stopX = Random().nextInt(width)
var stopY = Random().nextInt(height)
myPaint.strokeWidth = 1f
myPaint.setColor(color)
myCanvas.drawLine(startX.toFloat(), startY.toFloat(), stopX.toFloat(),
stopY.toFloat() , myPaint)
}
return myBitmap
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".view200.VerificationCodeActivity">
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/et_ver"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:hint="请输入验证码(不区分大小写)"/>
<Button
android:id="@+id/btn_ver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始验证"/>
</LinearLayout>