[轉]【基於zxing的編解碼實戰】精簡Barcode Scanner篇

來源:互聯網
上載者:User

標籤:

通過《【搞定條碼】zxing項目源碼解讀(2.3.0版本,Android部分)》的分析,現在可以實現最終目標了:精簡Barcode Scanner並將其中的編碼和解碼分離為兩個獨立的部分,方便日後快速整合到自己的項目中去。

編碼

在上一篇分析中,對於編碼部分已經有所透露,核心部分只有兩個package。現在將分享的部分再去掉分享app、分享書籤的功能,保留分享剪下板和分享連絡人以及編碼文本的功能:

編碼部分的邏輯清晰,程式碼群組織整齊,在前面瞭解zxing整體結構的基礎上一直做減法即可。

精簡過後該項目起名為XBarcodeGenerator

可以實現的功能包括:

  • 分享連絡人

  • 分享剪下板

  • 編碼輸入文本

主介面布局稍稍修改了下,新增了一個按鈕。代碼託管至:Zxing-Simplification

解碼

在Barcode Scanner的基礎上,做出以下調整:

  • 去掉編碼部分。去掉整個com.google.zxing.client.android.encode包及相應布局

  • 去掉分享部分。去掉com.google.zxing.client.android.share包及相應布局

  • 精簡設定。去掉“自訂搜尋網址”,修改前燈的描述,預設使用自動對焦,去掉搜尋國家,沒有持續關注

  • 調整橫屏為豎屏展示

  • 美化viewfinderview(可選)

調整橫屏為豎屏進行掃描共分為5步:

1. 調整CaptureActivity的方向為豎屏顯示

修改AndroidManifest.xml中:

android:screenOrientation=“landscape"

為

android:screenOrientation="portrait"

2. 調整相機預覽介面方向

在CameraConfigurationManager.setDesiredCameraParameters的最後增加一行代碼:

camera.setDisplayOrientation(90);

調整相機preview的時鐘方向與手機豎屏的自然方向一致。該方法必須在startPreview之前被調用,在預覽介面展示出來後設定是無效的。

參考:Camera.setDisplayOrientation(int)

3. 調整掃描視窗尺寸

修改CameraManager.getFramingRectInPreview()中的

public synchronized Rect getFramingRectInPreview() {...rect.left = rect.left * cameraResolution.x / screenResolution.x;rect.right = rect.right * cameraResolution.x / screenResolution.x;rect.top = rect.top * cameraResolution.y / screenResolution.y;rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;framingRectInPreview = rect;...}

修改為:

public synchronized Rect getFramingRectInPreview() {...rect.left = rect.left * cameraResolution.y / screenResolution.x;rect.right = rect.right * cameraResolution.y / screenResolution.x;rect.top = rect.top * cameraResolution.x / screenResolution.y;rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;framingRectInPreview = rect;...}

由於修改了螢幕的初始方向,手機解析度由原來的width*height變為height*width形式,但是相機的解析度則是固定的,因此這裡需做些調整以計算出正確的縮放比率。

4. 將掃描框設定為正方形

    public synchronized Rect getFramingRect() {        if (framingRect == null) {            if (camera == null) {                return null;            }            Point screenResolution = configManager.getScreenResolution();            if (screenResolution == null) {                // Called early, before init even finished                return null;            }            int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH,                    MAX_FRAME_WIDTH);            // 將掃描框設定成一個正方形            int height = width;            int leftOffset = (screenResolution.x - width) / 2;            int topOffset = (screenResolution.y - height) / 2;            framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);                        Log.d(TAG, "Calculated framing rect: " + framingRect);        }                return framingRect;    }

讓height=width即可

5. 反轉掃描到的圖形

修改DecodeHandler.decode方法,增加以下代碼

private void decode(byte[] data, int width, int height) {long start = System.currentTimeMillis();Result rawResult = null;// 新增反轉資料代碼開始byte[] rotatedData = new byte[data.length];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++)rotatedData[x * height + height - y - 1] = data[x + y * width];}int tmp = width; width = height;height = tmp;// 新增結束PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData,width, height);if (source != null) {BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));try {// 預覽介面最終取到的是個bitmap,然後對其進行解碼rawResult = multiFormatReader.decodeWithState(bitmap);} catch (ReaderException re) {// continue} finally {multiFormatReader.reset();}}...

如果要仿照做一個掃描視窗,可參考《基於google Zxing實現二維碼、條碼掃描,仿二維碼掃描效果》

精簡過後該項目起名為XBarcodeScanner,代碼託管至:Zxing-Simplification

[轉]【基於zxing的編解碼實戰】精簡Barcode Scanner篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.