Zxing二維碼自訂修改關鍵代碼,zxing關鍵

來源:互聯網
上載者:User

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,你去瞭解一下吧,希望對你有協助!望採納!
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.