日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于ZXing的二维码,你可以这样改造它

發(fā)布時間:2025/3/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于ZXing的二维码,你可以这样改造它 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述:

? 如果你下載了ZXing的源碼和ZXing的core.jar包,那么你現(xiàn)在就可以進行如下的一系列修改來自定義你的二維碼掃描了。


本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/47088951 -- Coding-Naga
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--轉(zhuǎn)載請注明出處

1.修改橫豎屏

? 這一步其實是相對來說還是比較復(fù)雜的。因為這里需要針對兩個不同方面進行修改,一個是橫豎屏的切換,另一個是圖像伸縮的修改。

? (1)修改Manifest中CaptureActivity類的屬性為android:screenOrientation="sensor"

? (2)修改CaptureActivity類,在onResume方法中調(diào)用下面的代碼:

private void setOrientation() {WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);mRotation = manager.getDefaultDisplay().getRotation();boolean orientationFlag = true;int screenState = CaptureActivity.this.getResources().getConfiguration().orientation;if (screenState == Configuration.ORIENTATION_LANDSCAPE){orientationFlag = false;mOrientationFlag = false;} else if (screenState ==Configuration.ORIENTATION_PORTRAIT) {orientationFlag = true;mOrientationFlag = true;}EventBus.getDefault().post(orientationFlag, RESET_ORIENTATION);}

? (3)修改DecodeHandler類

? 在如下代碼

<span style="font-family:Courier New;font-size:14px;">PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);</span>

的上方添加以下代碼:

if (mPortraitFlag) {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; // Here we are swapping, that's the difference to #11width = height;height = tmp;data = rotatedData;} mPortraitFlag的獲得是通過Android的總線事件來獲得:

@Subscriber(tag = "reset_orientation")private void updateFlag(boolean flag) {mPortraitFlag = flag;} ? (4)在CameraConfigurationManager類的initFromCameraParameters方法中

? Point screenResolutionForCamera = new Point();代碼的下面添加如下代碼:

if (CaptureActivity.getOrientationFlag()) {screenResolutionForCamera.x = screenResolution.x;screenResolutionForCamera.y = screenResolution.y;if (screenResolution.x < screenResolution.y) {screenResolutionForCamera.x = screenResolution.y;screenResolutionForCamera.y = screenResolution.x;}cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolutionForCamera);} else {cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution); }

? (5)在CameraConfigurationManager類的setDesiredCameraParameters方法中

? camera.setParameters(parameters);代碼的上面添加如下代碼:

String model = android.os.Build.MODEL;int extraAngle = 0;if (model.equalsIgnoreCase("MediaPad 10 FHD")) {extraAngle = -90;} else if (model.startsWith("EBEN")) {extraAngle = -90;}switch (CaptureActivity.getRotationFlag()) {case Surface.ROTATION_0:camera.setDisplayOrientation((360 + 90 + extraAngle) % 360);break;case Surface.ROTATION_90:camera.setDisplayOrientation((360 + 0 + extraAngle) % 360);break;case Surface.ROTATION_180:camera.setDisplayOrientation((360 + 270 + extraAngle) % 360);break;case Surface.ROTATION_270:camera.setDisplayOrientation((360 + 180 + extraAngle) % 360);break;default:break;} 這里是對部分機型進行了一個簡單的適配。

? (6)在CameraManager類的getFramingRectInPreview方法中作如下修改:

if (mPortraitFlag) {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;} else {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;}

2.修改掃描矩形的邊框大小

? 我們通過CameraManager類中的findDesiredDimensionInRange方法來修改掃描矩形的大小和邊長比例。

??int dim = 5 * resolution / 8;

? 上面代碼中5和8就是用來修改這個矩形大小的值,你可以嘗試著來實踐一下。

3.修改掃描結(jié)果的字符編碼

? 第1步:

? 在com.google.zxing.client.android.CaptureActivity類中,將

? ?characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET);

? 這一句修改為:

? ?characterSet = "ISO-8859-1";

? 第2步:

? 在handleDecodeInternally方法中,修改如下代碼:

CharSequence displayContents = resultHandler.getDisplayContents();String decodeContent = "";try {decodeContent = new String(displayContents.toString().getBytes(characterSet), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();} ? 以上兩步就是把編碼格式轉(zhuǎn)換為了UTF-8格式了。

4.添加掃描矩形的四個邊角

? 針對com.google.zxing.client.android包下ViewfinderView類

/*** 繪制掃描框上的四個邊角* @param canvas* @param frame*/private void drawFourCorner(Canvas canvas, Rect frame) {paint.setColor(getResources().getColor(R.color.green));// 左上角canvas.drawRect(frame.left, frame.top, frame.left + 30, frame.top + 10, paint);canvas.drawRect(frame.left, frame.top, frame.left + 10, frame.top + 30, paint);// 右上角canvas.drawRect(frame.right - 30, frame.top, frame.right, frame.top + 10, paint);canvas.drawRect(frame.right - 10, frame.top, frame.right, frame.top + 30, paint);// 左下角canvas.drawRect(frame.left, frame.bottom - 10, frame.left + 30, frame.bottom, paint);canvas.drawRect(frame.left, frame.bottom - 30, frame.left + 10, frame.bottom, paint);// 右下角canvas.drawRect(frame.right - 30, frame.bottom - 10, frame.right,frame.bottom, paint);canvas.drawRect(frame.right - 10, frame.bottom - 30, frame.right,frame.bottom, paint);}


效果:

? ????

5.修改掃描矩形中的線條

? 這里我們通過三種方式來顯示掃描線條:

? (1)原生的紅色線條

? (2)自定義的一個會移動的線條

? (3)自定義一張會移動的圖片


? 實現(xiàn)代碼如下:

? (1)原生的紅色線條

? ? ?這里沒有做什么特別地修改,只是對繪制線條的這一模塊進行了一個適當?shù)胤庋b,為了更好地讓“用戶”去選擇應(yīng)該使用哪一個線條更合適。

/*** 原生的掃描線條* * @param canvas* @param frame*/private void drawSlidingRawLine(Canvas canvas, Rect frame) {Rect previewFrame = cameraManager.getFramingRectInPreview();paint.setColor(laserColor);paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;int middle = frame.height() / 2 + frame.top;canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1,middle + 2, paint);float scaleX = frame.width() / (float) previewFrame.width();float scaleY = frame.height() / (float) previewFrame.height();List<ResultPoint> currentPossible = possibleResultPoints;List<ResultPoint> currentLast = lastPossibleResultPoints;int frameLeft = frame.left;int frameTop = frame.top;if (currentPossible.isEmpty()) {lastPossibleResultPoints = null;} else {possibleResultPoints = new ArrayList<ResultPoint>(5);lastPossibleResultPoints = currentPossible;paint.setAlpha(CURRENT_POINT_OPACITY);paint.setColor(resultPointColor);synchronized (currentPossible) {for (ResultPoint point : currentPossible) {canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop+ (int) (point.getY() * scaleY),POINT_SIZE, paint);}}}if (currentLast != null) {paint.setAlpha(CURRENT_POINT_OPACITY / 2);paint.setColor(resultPointColor);synchronized (currentLast) {float radius = POINT_SIZE / 2.0f;for (ResultPoint point : currentLast) {canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop+ (int) (point.getY() * scaleY), radius,paint);}}}} ? (2)自定義的一個會移動的線條

/*** 以下為用漸變線條作為掃描線* * @param canvas* @param frame*/private void drawSlidingSolidLine(Canvas canvas, Rect frame) {// 漸變圖為矩形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 + 3 + i);// 設(shè)置漸變圖填充邊界mDrawable.setBounds(mRect);// 畫出漸變線條mDrawable.draw(canvas);} ? (3)自定義一張會移動的圖片

/*** 以下為圖片作為掃描線* * @param canvas* @param frame*/private void drawSlidingImage(Canvas canvas, Rect frame) {mRect.set(frame.left - 6, frame.top + i - 6, frame.right + 6, frame.top+ 6 + i);lineDrawable.setBounds(mRect);lineDrawable.draw(canvas);}

總結(jié)

以上是生活随笔為你收集整理的基于ZXing的二维码,你可以这样改造它的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲区一区二区三区 | 国精产品一区一区三区有限公司杨 | 亚洲精品一区在线 | 最近最好的2019中文 | 亚洲av少妇一区二区在线观看 | 手机av免费观看 | 欧美r级在线观看 | 九九九国产 | a级片网址| 99cao| 日韩中文字幕一区 | a∨色狠狠一区二区三区 | 亚洲成人精品网 | 无套在线观看 | 驯服少爷漫画免费观看下拉式漫画 | 亚洲av无码一区二区三区在线观看 | 国产精选中文字幕 | 毛片在线网址 | 成人调教视频 | 久久福利精品 | 日韩伊人 | 成人18视频免费69 | 国产欧美久久久久久 | 天堂色在线 | videos另类灌满极品另类 | 国产学生美女无遮拦高潮视频 | 爱av在线| 亚洲熟妇av日韩熟妇在线 | xxx国产| 欧美少妇精品 | 爆乳熟妇一区二区三区霸乳 | 九九九九色 | 又大又硬又爽免费视频 | 天天摸夜夜爽 | 亚洲啊啊啊啊啊 | 伊人快播| 粉嫩aⅴ一区二区三区 | 欧美日韩高清一区二区三区 | 日韩av网站大全 | jvid在线 | 麻豆av一区 | 国产做爰xxxⅹ性视频国 | 亚洲又粗又长 | 亚洲欧洲中文 | 国产做爰视频免费播放 | 欧美日本韩国 | youjizz国产精品 | 天堂素人约啪 | 性网址| 午夜黄色网 | 黄色特级片| 国产91av在线播放 | 国模少妇一区二区 | 精品黄色在线观看 | 国产精品视频 | 国产精品电影一区二区三区 | h在线免费| 长篇高h肉爽文丝袜 | 欧美xxxbbb| 国产精品网址 | 被黑人各种姿势猛c哭h文1 | 欧美精品黑人 | 欧美日韩精品在线播放 | 亚洲国产成人在线观看 | 亚洲性影院 | 国内一级视频 | 激情婷婷丁香 | 亚洲国产av一区 | 黑人巨大精品 | 成人激情视频网站 | 在线视频欧美日韩 | 国产又大又粗又爽的毛片 | 久久密av| 伊人网综合在线 | 偷拍一区二区三区 | 午夜影院污| 伊人网视频在线观看 | 国产精品无码影院 | 亚洲精品无码一区二区 | 日本大尺度床戏揉捏胸 | 五月天激情四射 | 国产无遮挡一区二区三区毛片日本 | 一亲二脱三插 | 欧美先锋影音 | 91亚洲高清| 69影院在线观看 | 高清无码视频直接看 | 亚洲熟女乱综合一区二区三区 | 日韩精品免费电影 | 成人另类小说 | 久久久综合网 | 日韩福利网站 | 欧美涩涩视频 | 爱草在线视频 | 国产精品久久久免费 | 国产福利资源 | 思思99re | 涩涩涩涩av | 男人视频网 |