ZXing開發(fā)詳解
文章出處:研維官網(wǎng)人氣:
發(fā)表時(shí)間2019-09-10 09:05:50
什么是Z*?
在Android平臺(tái)做過(guò)二維碼相關(guān)模塊的肯定都熟知ZXing開源項(xiàng)目,Z*是一個(gè)開源Java類庫(kù)用于解析多種格式的1D/2D條形碼。目標(biāo)是能夠?qū)R編碼、Data Matrix、UPC的1D條形碼進(jìn)行解碼。 其提供了多種平臺(tái)下的客戶端包括:J2ME、J2SE和Android。其GitHub地址是:傳送門
Z*項(xiàng)目里面代碼很多,實(shí)現(xiàn)的功能也很多,我們的應(yīng)用只需要?jiǎng)冸x其中的掃描模塊即可,再多一點(diǎn)也就是生成二維碼的功能;接下來(lái)我們就一起來(lái)精簡(jiǎn)ZXing項(xiàng)目,終形成一個(gè)小的Demo案例,當(dāng)然江湖上已經(jīng)有過(guò)N多種版本的ZXing精簡(jiǎn)項(xiàng)目,什么橫屏改豎屏,繪制掃描界面,開啟閃光燈等等,并且許多都是基于ZXing2.3.0來(lái)做精簡(jiǎn)的,后續(xù)有許多更新的版本,包括自動(dòng)對(duì)焦,Camera管理,bug修復(fù)等等新功能;筆者使用的是ZXing3.1.0版本,這里需要說(shuō)明的就是我的這版Demo絕對(duì)是江湖上面還沒(méi)有出現(xiàn)的,也算是一點(diǎn)點(diǎn)小小的創(chuàng)新把,那就是去除ZXing項(xiàng)目中惱人的ViewFinderView的繪制,使用XML布局掃描界面,添加掃描動(dòng)畫,精確計(jì)算掃描區(qū)域
克隆Z*項(xiàng)目到本地
1
git clone https://github.com/zxing/zxing.git
整理ZXing代碼
打開ZXing項(xiàng)目的文件夾,可以看到如下文件目錄:
其中我們主要關(guān)注2個(gè)文件夾里的內(nèi)容:
1. core : Z*項(xiàng)目的核心代碼,可以新建一個(gè)Java工程,然后export成jar來(lái)調(diào)用。如下圖所示:
免打包即可獲得的zxing-3.1.0.jar 猛戳下載
2. android : Android示例工程代碼,成功運(yùn)行之后就是一個(gè)專業(yè)的掃碼應(yīng)用了。如下圖所示:
免引入免整理的zxing原始工程 ZXingRawProject 猛戳下載
但是這樣就讓你滿足了,那怎么可以說(shuō)是極致二維碼掃描呢,有木有感覺(jué)ZXing的掃描框的繪制很不爽啊?自定義的View繪制的很丑,多屏幕適配的時(shí)候還經(jīng)常不兼容,原始項(xiàng)目還是橫屏模式的,目前大家都習(xí)慣豎屏掃描呢。怎么辦?別怕,我來(lái)告訴你,我要將ViewFinderView砍掉,使用xml界面布局,添加掃描動(dòng)畫,終一樣準(zhǔn)確無(wú)誤的掃描到二維碼數(shù)據(jù),只需要對(duì)準(zhǔn),是的,毫厘不差的對(duì)準(zhǔn)就可以了。
精簡(jiǎn)Z*代碼,打造極致掃描
1. 去掉Z*中一些和掃描無(wú)關(guān)的代碼,終留下的代碼結(jié)構(gòu)如下圖所示,關(guān)鍵的是你看不到ViewFinderView 了
2. 布局掃描界面,xml代碼如下:
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/capture_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<RelativeLayout
android:id="@+id/capture_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/capture_mask_top"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_alignParentTop="true"
android:background="@drawable/shadow" />
<RelativeLayout
android:id="@+id/capture_crop_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_below="@id/capture_mask_top"
android:layout_centerHorizontal="true"
android:background="@drawable/qr_code_bg" >
<ImageView
android:id="@+id/capture_scan_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:src="@drawable/scan_line" />
</RelativeLayout>
<ImageView
android:id="@+id/capture_mask_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@id/capture_crop_view"
android:background="@drawable/shadow" />
<ImageView
android:id="@+id/capture_mask_left"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_above="@id/capture_mask_bottom"
android:layout_alignParentLeft="true"
android:layout_below="@id/capture_mask_top"
android:layout_toLeftOf="@id/capture_crop_view"
android:background="@drawable/shadow" />
<ImageView
android:id="@+id/capture_mask_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_above="@id/capture_mask_bottom"
android:layout_alignParentRight="true"
android:layout_below="@id/capture_mask_top"
android:layout_toRightOf="@id/capture_crop_view"
android:background="@drawable/shadow" />
</RelativeLayout>
</RelativeLayout>
3. 計(jì)算截取區(qū)域 貼心注解: 如果你沒(méi)有看上一篇ZBar掃描中關(guān)于掃描區(qū)域計(jì)算的解釋,那趕緊回去,咱不能急,看完再來(lái)接上,否則你會(huì)不理解的!傳送門
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
private void initCrop() {
int cameraWidth = cameraManager.getCameraResolution().y;
int cameraHeight = cameraManager.getCameraResolution().x;
/** 獲取布局中掃描框的位置信息 */
int[] location = new int[2];
scanCropView.getLocationInWindow(location);
int cropLeft = location[0];
int cropTop = location[1] - getStatusBarHeight();
int cropWidth = scanCropView.getWidth();
int cropHeight = scanCropView.getHeight();
/** 獲取布局容器的寬高 */
int containerWidth = scanContainer.getWidth();
int containerHeight = scanContainer.getHeight();
/** 計(jì)算終截取的矩形的左上角頂點(diǎn)x坐標(biāo) */
int x = cropLeft * cameraWidth / containerWidth;
/** 計(jì)算終截取的矩形的左上角頂點(diǎn)y坐標(biāo) */
int y = cropTop * cameraHeight / containerHeight;
/** 計(jì)算終截取的矩形的寬度 */
int width = cropWidth * cameraWidth / containerWidth;
/** 計(jì)算終截取的矩形的高度 */
int height = cropHeight * cameraHeight / containerHeight;
/** 生成終的截取的矩形 */
mCropRect = new Rect(x, y, width + x, height + y);
}
此文關(guān)鍵字:此文關(guān)鍵詞:
相關(guān)資訊
同類文章排行
- 部隊(duì)查手機(jī)數(shù)據(jù)的儀器
- 專變采集終端485接線圖
- 平板電腦尺寸規(guī)格
- 在線掃描條形碼
- 交警移動(dòng)執(zhí)法手持機(jī)PDA的選型應(yīng)用介紹
- 條碼掃描器在線使用
- 工業(yè)觸摸一體機(jī)是選擇電阻屏還是電容屏呢?
- pda手持設(shè)備
- MES系統(tǒng)二維碼條碼掃描器手持終端PDA
- 工業(yè)觸摸屏顯示器生產(chǎn)廠家,國(guó)產(chǎn)工業(yè)觸摸屏生產(chǎn)廠家
最新資訊文章
- 15英寸工業(yè)平板電腦哪個(gè)牌子好
- 安卓系統(tǒng)12寸手持工業(yè)平板電腦支持條碼掃描識(shí)別
- 17英寸卡扣式嵌入式工業(yè)平板電腦機(jī)型
- 10英寸移動(dòng)式無(wú)線工業(yè)平板電腦支持車載安裝的機(jī)型推薦
- 手持終端pda應(yīng)用行業(yè)_二維碼數(shù)據(jù)采集器服務(wù)廠家
- 制造業(yè)條碼手持終端推薦_手持機(jī) 二維碼制造商
- PDA手持終端數(shù)據(jù)采集應(yīng)用領(lǐng)域_移動(dòng)手持終端平板電腦價(jià)格
- 餐桌安全手持終端推薦應(yīng)用_手持?jǐn)?shù)據(jù)采集終端生產(chǎn)廠家
- PDA手持終端優(yōu)點(diǎn)是什么_串口超高頻rfid 掃描平板哪家好
- 產(chǎn)品追溯工業(yè)手持終端推薦_云南省uhf工業(yè)平板哪家好