Jetpack Compose-使用ZXing展示二维码

前言

在 Jetpack Compose 中加载 BitmapImage 组件非常直接,你可以使用 asImageBitmap() 扩展函数将 Bitmap 转换为 Compose 可识别的 ImageBitmap 类型,然后通过 Image 组件显示。

asImageBitmap() 是一个轻量级转换函数,它并没有对原始 Bitmap 进行像素级复制或处理,而是通过包装原生 Bitmap 生成一个 ImageBitmap 引用(可以理解为「视图层的包装」)。
这个过程主要是建立 Compose 绘图系统与 Android 原生 Bitmap 的关联,执行时间通常在毫秒级以下,因此在主线程执行一般不会导致界面卡顿。

添加依赖

1
2
3
dependencies {
implementation("com.journeyapps:zxing-android-embedded:4.2.0")
}

获取二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import android.graphics.Bitmap
import android.graphics.Color
import com.google.zxing.BarcodeFormat
import com.google.zxing.WriterException
import com.google.zxing.qrcode.QRCodeWriter
import androidx.core.graphics.createBitmap
import androidx.core.graphics.set

object ZQRCodeUtils {
fun generateQRCode(text: String): Bitmap? {
val writer = QRCodeWriter()
try {
val bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, 512, 512) // 设置二维码的宽高,可根据需要调整
val width = bitMatrix.getWidth()
val height = bitMatrix.getHeight()
val bmp = createBitmap(width, height, Bitmap.Config.RGB_565)
for (x in 0..<width) {
for (y in 0..<height) {
bmp[x, y] = if (bitMatrix.get(x, y)) Color.BLACK else Color.WHITE
}
}
return bmp
} catch (e: WriterException) {
e.printStackTrace()
return null
}
}
}

展示

1
2
3
4
5
6
7
8
9
10
11
12
@Composable
fun ZImgLocalBitmap(bitmap: Bitmap) {
// 将Bitmap转换为ImageBitmap
val imageBitmap = bitmap.asImageBitmap()
Image(
bitmap = imageBitmap,
contentDescription = null,
modifier = Modifier
.fillMaxSize(),
contentScale = ContentScale.FillBounds
)
}

VM

1
2
3
4
5
val qrCodeBitmap = mutableStateOf<Bitmap?>(null)
val url = CommonData.reportUrl + it.id
viewModelScope.launch(Dispatchers.IO) {
qrCodeBitmap.value = ZQRCodeUtils.generateQRCode(url)
}