如何在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
相关产品推荐
相关产品推荐

