Zxing二維碼自訂修改關鍵代碼,zxing關鍵
官方源碼地址:http://code.google.com/p/zxing/downloads/list;
將下載的ZXing-X.X.zip解壓出來,我們只需要用到android目錄中的樣本項目,
將android項目匯入eclipse,同時別忘了將相應的jar匯入libs,此時該樣本項目應該可以運行了,不過該項目很多功能我們不需要,並且其掃描介面為橫向的,因此需對其修改。
接下去我們來將該樣本項目簡化:
第一步:拷貝必要的包和類
匯入完成後會有很多紅叉,大都和包的存取權限有關,因為範例程式碼中很多類是final型的,我們將其public就行;
此外還需要res下一些關聯的檔案(values下的color.xml、ids.xml、strings.xml,raw下的beep.ogg)。
初步調整後包結構如下:
第二步:PreferencesActivity和CaptureActivity修改
樣本項目用到了大量的配置,因此很多地方都用到了PreferencesActivity這個類,其實留著它也無所謂,但別忘了將樣本項目中res下一些關聯檔案拷貝過來(preferences.xml、arrays.xml);
不過PreferencesActivity完全是多餘的,看著也礙眼,因此我將其去掉,需要將用到PreferencesActivity的類都修改,就是剩餘那些報紅叉的類,我們需要將一些配置固定化,多餘的設定判斷去掉,此處就不貼代碼了;
同樣CaptureActivity中也有很多方法是我們不需要的,大都是關於解碼成功後的處理,如果要保留的話則需要額外拷貝很多類,因此將其去掉。
第三部:修改為豎屏
經過上面兩步,我們自己的項目應該可以運行了(別忘了加許可權),當然此時是橫屏的,因此我們需要修改幾處地方將其修改為豎屏:
1.CameraConfigurationManager類的initFromCameraParameters()方法中將以下代碼注釋掉:
if(width < height) {Log.i(TAG,"Display reports portrait orientation; assuming this is incorrect");int temp = width;width = height;height = temp;}
2.CameraConfigurationManager類的setDesiredCameraParameters()方法中在camera.setParameters(parameters)之前加入以下代碼:
camera.setDisplayOrientation(90);
3.CameraManager類的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;
替換為
<span style="font-size:14px;">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;</span>
4.DecodeHandler類的decode方法中在activity.getCameraManager().buildLuminanceSource()之前添加以下代碼:
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; data = rotatedData;
5.關鍵的一步,解決豎屏後映像展開問題。CameraConfigurationManager類的initFromCameraParameters()方法中:
在Log.i(TAG, "Screen resolution: " + screenResolution);之後添加以下代碼:
Point screenResolutionForCamera = new Point();screenResolutionForCamera.x = screenResolution.x;screenResolutionForCamera.y = screenResolution.y;if(screenResolution.x < screenResolution.y) {screenResolutionForCamera.x = screenResolution.y;screenResolutionForCamera.y = screenResolution.x;}
同時修改下一句為cameraResolution = findBestPreviewSizeValue(parameters,screenResolutionForCamera);
此外manifest中別忘了設定android:screenOrientation="portrait",至此豎屏修改完畢。
第四步:掃描框位置和大小修改
此時的掃描框是豎直展開的矩形,很難看,我們可以將其修改為正方形或扁平型的。
CameraManager類的getFramingRect()方法中替換以下代碼:
int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);int height = findDesiredDimensionInRange(screenResolution.y,MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
替換為
DisplayMetrics metrics = context.getResources().getDisplayMetrics();int width = (int)(metrics.widthPixels * 0.6);int height = (int) (width * 0.9);
此處我們根據螢幕解析度來定掃描框大小更靈活一點,同時將位移量topOffset修改為(screenResolution.y - height)/4
第五步:掃描框四個角和掃描線條修改
範例程式碼中的線條是置中且不動的,我們可以將其修改為上下移動的掃描線,且可以改變線條的樣式。
在自訂掃描布局ViewfinderView類中的onDraw()方法中繪製四個角,關鍵代碼如下:
//畫出四個角paint.setColor(getResources().getColor(R.color.green));//左上方canvas.drawRect(frame.left,frame.top, frame.left + 15,frame.top+ 5,paint);canvas.drawRect(frame.left,frame.top, frame.left + 5,frame.top + 15,paint);//右上方canvas.drawRect(frame.right- 15,frame.top, frame.right,frame.top + 5,paint);canvas.drawRect(frame.right- 5,frame.top, frame.right,frame.top + 15,paint);//左下角canvas.drawRect(frame.left,frame.bottom - 5,frame.left + 15,frame.bottom,paint);canvas.drawRect(frame.left,frame.bottom - 15,frame.left + 5,frame.bottom,paint);//右下角canvas.drawRect(frame.right- 15,frame.bottom - 5,frame.right,frame.bottom, paint);canvas.drawRect(frame.right- 5,frame.bottom - 15,frame.right,frame.bottom, paint);
此外將掃描線條修改為上下掃描的線,關鍵代碼如下:
if((i += 5)< frame.bottom - frame.top) { /* 以下為用漸層線條作為掃描線 *///漸層圖為矩形//mDrawable.setShape(GradientDrawable.RECTANGLE);//漸層圖為線型//mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);//線型矩形的四個圓角半徑mDrawable.setCornerRadii(new float[] { 8, 8, 8, 8, 8, 8, 8, 8 });//位置邊界//mRect.set(frame.left + 10, frame.top + i, frame.right - 10,// frame.top + 1 + i);//設定漸層圖填充邊界//mDrawable.setBounds(mRect);//畫出漸層線條//mDrawable.draw(canvas); /*以下為圖片作為掃描線 */mRect.set(frame.left- 6,frame.top + i - 6,frame.right + 6,frame.top+ 6+ i);lineDrawable.setBounds(mRect);lineDrawable.draw(canvas);//重新整理invalidate();}else{ i= 0; }此處採用了兩種線條樣式,一種是漸層線條,還有一種是類似的圖片掃描線。
樣本源碼工程
簡化後源碼.rar (2.38 MB, 下載次數: 293)
android Zxing二維碼掃描介面自訂
自訂相框 實際就是改你 CaptureActivity 類對應的 layout檔案的布局。紅線的話 就是繼承view重寫的一個布局,很多demo中都有的。
search.apkbus.com/...form.a
怎利用zxing的二維碼編碼功可以將代碼(例如A,B,C)編碼成二維碼
www.apkbus.com/...139981
此處是一個網友分享的二維碼產生和識別的教程,附有Demo,你去瞭解一下吧,希望對你有協助!望採納!