首先使用ZXing项目前我们需要对其进行简化,因为开源的ZXing项目中Android实现里面有太多多余的东西了,得对其进行简化,并且原始的ZXing项目扫描框并不美观所以也要对其进行自定义美化。
在开始前大致介绍一下简化ZXing需要用到各个包 、类的职责。
详细简化过程参考博文“http://www.cnblogs.com/keyindex/archive/2011/06/08/2074900.html”
自定义扫描框需要修改ViewfinderView自定义的View类。绘制窗体方法在onDraw(Canvas canvas)方法中。
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 |
@Override public
void onDraw(Canvas canvas) { Rect frame = CameraManager.get().getFramingRect(); if
(frame == null ) { return ; } // 初始化中间线滑动的最上边和最下边 if
(!isFirst) { isFirst = true ; slideTop = frame.top; slideBottom = frame.bottom; } int
width = canvas.getWidth(); int
height = canvas.getHeight(); // Draw the exterior (i.e. outside the framing rect) darkened paint.setColor(resultBitmap != null
? resultColor : maskColor); canvas.drawRect( 0 , 0 , width, frame.top, paint); canvas.drawRect( 0 , frame.top, frame.left, frame.bottom + 1 , paint); canvas.drawRect(frame.right + 1 , frame.top, width, frame.bottom + 1 , paint); canvas.drawRect( 0 , frame.bottom + 1 , width, height, paint); if
(resultBitmap != null ) { // Draw the opaque result bitmap over the scanning rectangle paint.setAlpha(OPAQUE); canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint); } else
{ // 画扫描框 paint.setColor(frameColor); canvas.drawRect(frame.left, frame.top, frame.right + 1 , frame.top + 2 , paint); canvas.drawRect(frame.left, frame.top + 2 , frame.left + 2 , frame.bottom - 1 , paint); canvas.drawRect(frame.right - 1 , frame.top, frame.right + 1 , frame.bottom - 1 , paint); canvas.drawRect(frame.left, frame.bottom - 1 , frame.right + 1 , frame.bottom + 1 , paint); paint.setColor(laserColor); //画扫描框边上的角,总共8个部分 canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top + ScreenRate, paint); canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top + ScreenRate, paint); canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + ScreenRate, frame.bottom, paint); canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left + CORNER_WIDTH, frame.bottom, paint); canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate, frame.right, frame.bottom, paint); paint.setAlpha(SCANNER_ALPHA[scannerAlpha]); scannerAlpha = (scannerAlpha + 1 ) % SCANNER_ALPHA.length; //绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE slideTop += SPEEN_DISTANCE; if (slideTop >= frame.bottom){ slideTop = frame.top; } canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/ 2 , frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/ 2 , paint); Collection<ResultPoint> currentPossible = possibleResultPoints; Collection<ResultPoint> currentLast = lastPossibleResultPoints; if
(currentPossible.isEmpty()) { lastPossibleResultPoints = null ; } else
{ possibleResultPoints = new
HashSet<ResultPoint>( 5 ); lastPossibleResultPoints = currentPossible; paint.setAlpha(OPAQUE); paint.setColor(resultPointColor); for
(ResultPoint point : currentPossible) { canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6 .0f, paint); } } if
(currentLast != null ) { paint.setAlpha(OPAQUE / 2 ); paint.setColor(resultPointColor); for
(ResultPoint point : currentLast) { canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 3 .0f, paint); } } postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom); } } |
利用开源ZXing项目实现条形码和二维码扫描识别 —— Android端,布布扣,bubuko.com
利用开源ZXing项目实现条形码和二维码扫描识别 —— Android端
原文:http://www.cnblogs.com/ggzjj/p/3612602.html