1. <samp id="vauvb"></samp>

      <span id="vauvb"></span>

      1. ?

        服務熱線:025-86138771/18014487552
        當前位置:主頁 > 新聞動態 > > ZXing開發詳解

        ZXing開發詳解

        文章出處:研維官網人氣: 發表時間2019-09-10 09:05:50
        什么是Z*?
        在Android平臺做過二維碼相關模塊的肯定都熟知ZXing開源項目,Z*是一個開源Java類庫用于解析多種格式的1D/2D條形碼。目標是能夠對QR編碼、Data Matrix、UPC的1D條形碼進行解碼。 其提供了多種平臺下的客戶端包括:J2ME、J2SE和Android。其GitHub地址是:傳送門
         
        Z*項目里面代碼很多,實現的功能也很多,我們的應用只需要剝離其中的掃描模塊即可,再多一點也就是生成二維碼的功能;接下來我們就一起來精簡ZXing項目,終形成一個小的Demo案例,當然江湖上已經有過N多種版本的ZXing精簡項目,什么橫屏改豎屏,繪制掃描界面,開啟閃光燈等等,并且許多都是基于ZXing2.3.0來做精簡的,后續有許多更新的版本,包括自動對焦,Camera管理,bug修復等等新功能;筆者使用的是ZXing3.1.0版本,這里需要說明的就是我的這版Demo絕對是江湖上面還沒有出現的,也算是一點點小小的創新把,那就是去除ZXing項目中惱人的ViewFinderView的繪制,使用XML布局掃描界面,添加掃描動畫,精確計算掃描區域
         
        克隆Z*項目到本地
        1
        git clone https://github.com/zxing/zxing.git
        整理ZXing代碼
        打開ZXing項目的文件夾,可以看到如下文件目錄:
         
         
         
        其中我們主要關注2個文件夾里的內容: 
         
        1. core : Z*項目的核心代碼,可以新建一個Java工程,然后export成jar來調用。如下圖所示:
         
         
         
        免打包即可獲得的zxing-3.1.0.jar  猛戳下載 
         
        2. android : Android示例工程代碼,成功運行之后就是一個專業的掃碼應用了。如下圖所示:
         
         
         
        免引入免整理的zxing原始工程 ZXingRawProject  猛戳下載
         
        但是這樣就讓你滿足了,那怎么可以說是極致二維碼掃描呢,有木有感覺ZXing的掃描框的繪制很不爽???自定義的View繪制的很丑,多屏幕適配的時候還經常不兼容,原始項目還是橫屏模式的,目前大家都習慣豎屏掃描呢。怎么辦?別怕,我來告訴你,我要將ViewFinderView砍掉,使用xml界面布局,添加掃描動畫,終一樣準確無誤的掃描到二維碼數據,只需要對準,是的,毫厘不差的對準就可以了。
         
        精簡Z*代碼,打造極致掃描
        1. 去掉Z*中一些和掃描無關的代碼,終留下的代碼結構如下圖所示,關鍵的是你看不到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. 計算截取區域 貼心注解: 如果你沒有看上一篇ZBar掃描中關于掃描區域計算的解釋,那趕緊回去,咱不能急,看完再來接上,否則你會不理解的!傳送門
         
        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(); 
           
            /** 計算終截取的矩形的左上角頂點x坐標 */ 
            int x = cropLeft * cameraWidth / containerWidth; 
            /** 計算終截取的矩形的左上角頂點y坐標 */ 
            int y = cropTop * cameraHeight / containerHeight; 
           
            /** 計算終截取的矩形的寬度 */ 
            int width = cropWidth * cameraWidth / containerWidth; 
            /** 計算終截取的矩形的高度 */ 
            int height = cropHeight * cameraHeight / containerHeight; 
           
            /** 生成終的截取的矩形 */ 
            mCropRect = new Rect(x, y, width + x, height + y); 
        研維小尺寸手持終端PDA:6寸windows10操作系統,支持一維碼、二維碼掃描,IP67加固型工業手持機,支持底座通訊、藍牙手柄、電池可拆卸,自帶wifi藍牙GPS
        此文關鍵字:此文關鍵詞:

        相關資訊

          ?

          南京研維信息微信,掃掃有驚喜哦!

          在線客服
          边做饭边被躁在线播放 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>