標籤:
通過《【搞定條碼】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篇