下面讲解有关二维码的生成:

先来讲解一下对应的入参所表示的意思:

创建二维码位图 (支持自定义配置和自定义样式)

param content 字符串内容 

param width 位图宽度,要求>=0(单位:px)

param height 位图高度,要求>=0(单位:px)

param character_set 字符集/字符转码格式 (支持格式:{@link CharacterSetECI })。传null时,zxing源码默认使用 "ISO-8859-1"

param error_correction 容错级别 (支持级别:{@link ErrorCorrectionLevel })。传null时,zxing源码默认使用 "L"

param margin 空白边距 (可修改,要求:整型且>=0), 传null时,zxing源码默认使用"4"。

param color_black 黑色色块的自定义颜色值

param color_white 白色色块的自定义颜色值

下面是具体的实现步骤:

1.参数合法性判断
if (width < 0 || height < 0) { // 宽和高都需要>=0
    return null
}
2.设置二维码相关配置,生成BitMatrix(位矩阵)对象 
val hints: Hashtable<EncodeHintType, String> = Hashtable()
if (character_set.isNotEmpty()) {
    hints[EncodeHintType.CHARACTER_SET] = character_set // 字符转码格式设置
}
if (error_correction.isNotEmpty()) {
    hints[EncodeHintType.ERROR_CORRECTION] = error_correction // 容错级别设置
}
if (margin.isNotEmpty()) {
    hints[EncodeHintType.MARGIN] = margin // 空白边距设置
}
val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)
3.创建像素数组,并根据BitMatrix(位矩阵)对象为数组元素赋颜色值
val pixels = IntArray(width * height)
for (y in 0 until height) {
    for (x in 0 until width) {
        if (bitMatrix[x, y]) {
            pixels[y * width + x] = color_black // 黑色色块像素设置
        } else {
            pixels[y * width + x] = color_white // 白色色块像素设置
        }
    }
}
4.创建Bitmap对象,根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象 
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
bitmap.setPixels(pixels, 0, width, 0, 0, width, height)
return bitmap

最后贴上完整的代码:

fun createQRCodeBitmap(
    content: String,
    width: Int,
    height: Int,
    character_set: String = "UTF-8",
    error_correction: String = "H",
    margin: String = "1",
    @ColorInt color_black: Int = Color.BLACK,
    @ColorInt color_white: Int = Color.WHITE
): Bitmap? {
    
    if (width < 0 || height < 0) { 
        return null
    }
    try {
       
        val hints: Hashtable<EncodeHintType, String> = Hashtable()
        if (character_set.isNotEmpty()) {
            hints[EncodeHintType.CHARACTER_SET] = character_set 
        }
        if (error_correction.isNotEmpty()) {
            hints[EncodeHintType.ERROR_CORRECTION] = error_correction 
        }
        if (margin.isNotEmpty()) {
            hints[EncodeHintType.MARGIN] = margin         }
        val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)

         
        val pixels = IntArray(width * height)
        for (y in 0 until height) {
            for (x in 0 until width) {
                if (bitMatrix[x, y]) {
                    pixels[y * width + x] = color_black 
                } else {
                    pixels[y * width + x] = color_white 
                }
            }
        }
       
        val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height)
        return bitmap
    } catch (e: WriterException) {
        e.printStackTrace()
    }
    return null
}
12-16 11:06