You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android端用ZXing生成圆点QR码并修复定位图案显示异常问题

问题修复方案

问题根源

  • Android Canvas.drawCircle() 传入的参数为 (圆心X坐标, 圆心Y坐标, 半径, 画笔),你之前混淆了直径和半径,同时直接把格子/定位图案的左上角坐标当成了圆心坐标,导致定位图案位置偏移、尺寸异常。
  • 原AWT的fillOval()参数为(左上角X, 左上角Y, 宽度, 高度),和Android绘制圆形的参数逻辑完全不同,不能直接替换参数。

修改代码

1. 调整内部小圆点绘制逻辑

找到createQRCode2方法中内部圆点绘制的代码,替换为以下内容:

if (!(inputX <= FINDER_PATTERN_SIZE && inputY <= FINDER_PATTERN_SIZE ||
        inputX >= inputWidth - FINDER_PATTERN_SIZE && inputY <= FINDER_PATTERN_SIZE ||
        inputX <= FINDER_PATTERN_SIZE && inputY >= inputHeight - FINDER_PATTERN_SIZE)) {
    // 计算当前格子的圆心坐标,半径取缩放后直径的1/2
    float centerX = outputX + multiple / 2f;
    float centerY = outputY + multiple / 2f;
    float radius = circleSize / 2f;
    canvas.drawCircle(centerX, centerY, radius, paint);
}

2. 重写定位图案绘制方法

替换整个drawFinderPatternCircleStyle1方法:

private static void drawFinderPatternCircleStyle1(Canvas canvas, int x, int y, int circleDiameter, Paint paint) {
    // 计算定位图案的统一圆心坐标
    float centerX = x + circleDiameter / 2f;
    float centerY = y + circleDiameter / 2f;

    // 绘制最外层黑圈
    paint.setColor(Color.BLACK);
    canvas.drawCircle(centerX, centerY, circleDiameter / 2f, paint);

    // 绘制中间白圈
    final int WHITE_CIRCLE_DIAMETER = circleDiameter * 5 / 7;
    paint.setColor(Color.WHITE);
    canvas.drawCircle(centerX, centerY, WHITE_CIRCLE_DIAMETER / 2f, paint);

    // 绘制最内层圆点(可替换为你自定义的颜色)
    final int MIDDLE_DOT_DIAMETER = circleDiameter * 3 / 7;
    paint.setColor(Color.BLUE);
    canvas.drawCircle(centerX, centerY, MIDDLE_DOT_DIAMETER / 2f, paint);
}

内容的提问来源于stack exchange,提问作者Kruti Bhatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:36:03