Android ZXing条形码扫描识别

阅读: 评论:0

Android ZXing条形码扫描识别

Android ZXing条形码扫描识别

项目中需要使用到条形码的扫描识别,网上查阅资料发现,大部分人都使用的 Zxing

但是对这些条形码扫描的界面都不太满意,所以自定义一个条形码扫描界面

引入库

 implementation &#le.zxing:core:3.3.3'implementation('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false }

自定义扫描界面

t.Context;
aphics.Canvas;
aphics.LinearGradient;
aphics.Rect;
aphics.Shader;
import android.util.AttributeSet;le.zxing.ResultPoint;
import com.journeyapps.barcodescanner.ViewfinderView;import java.util.ArrayList;
import java.util.List;/*** 自定义扫描界面*/public class QrView extends ViewfinderView {public int laserLinePosition = 0;public float[] position = new float[]{0f, 0.5f, 1f};public int[] colors = new int[]{0x0027B14D, 0xff27B14D, 0x0027B14D};public LinearGradient linearGradient;private int ScreenRate;public QrView(Context context, AttributeSet attrs) {super(context, attrs);float density = Resources().getDisplayMetrics().density;ScreenRate = (int) (15 * density);}@Overridepublic void onDraw(Canvas canvas) {int CORNER_WIDTH = 15;refreshSizes();if (framingRect == null || previewFramingRect == null) {return;}Rect frame = framingRect;Rect previewFrame = previewFramingRect;int width = Width();int height = Height();//绘制4个角paint.setColor(getResources().lorPrimary));//定义画笔的颜色canvas.drawRect(frame.left, p, frame.left + ScreenRate, p + CORNER_WIDTH, paint);canvas.drawRect(frame.left, p, frame.left + CORNER_WIDTH, p + ScreenRate, paint);canvas.drawRect(frame.right - ScreenRate, p, frame.right, p + CORNER_WIDTH, paint);canvas.drawRect(frame.right - CORNER_WIDTH, p, frame.right, p + ScreenRate, paint);canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + ScreenRate, frame.bottom, paint);canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left + CORNER_WIDTH, frame.bottom, paint);canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint);canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate, frame.right, frame.bottom, paint);// 画出外部(即构图矩形之外)变暗paint.setColor(resultBitmap != null ? resultColor : maskColor);canvas.drawRect(0, 0, width, p, paint);canvas.drawRect(0, p, frame.left, frame.bottom, paint);canvas.drawRect(frame.right, p, width, frame.bottom, paint);canvas.drawRect(0, frame.bottom, width, height, paint);if (resultBitmap != null) {// Draw the opaque result bitmap over the scanning rectanglepaint.setAlpha(CURRENT_POINT_OPACITY);canvas.drawBitmap(resultBitmap, null, frame, paint);} else {laserLinePosition = laserLinePosition + 8;if (laserLinePosition >= frame.height()) {laserLinePosition = 0;}linearGradient = new LinearGradient(frame.left + 1, p + laserLinePosition, frame.right - 1, p + 10 + laserLinePosition, colors, position, Shader.TileMode.CLAMP);// Draw a red "laser scanner" line through the middle to show decoding is activepaint.setShader(linearGradient);//绘制扫描线canvas.drawRect(frame.left + 1, p + laserLinePosition, frame.right - 1, p + 10 + laserLinePosition, paint);paint.setShader(null);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 = p;if (currentPossible.isEmpty()) {lastPossibleResultPoints = null;} else {possibleResultPoints = new ArrayList<>(5);lastPossibleResultPoints = currentPossible;paint.setAlpha(CURRENT_POINT_OPACITY);paint.setColor(resultPointColor);for (ResultPoint point : currentPossible) {canvas.drawCircle(frameLeft + (int) (X() * scaleX), frameTop + (int) (Y() * scaleY), POINT_SIZE, paint);}}if (currentLast != null) {paint.setAlpha(CURRENT_POINT_OPACITY / 2);paint.setColor(resultPointColor);float radius = POINT_SIZE / 2.0f;for (ResultPoint point : currentLast) {canvas.drawCircle(frameLeft + (int) (X() * scaleX), frameTop + (int) (Y() * scaleY), radius, paint);}}postInvalidateDelayed(16, frame.left, p, frame.right, frame.bottom);}}
}

l

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android=""xmlns:app=""><com.journeyapps.barcodescanner.BarcodeViewandroid:id="@+id/zxing_barcode_surface"android:layout_width="match_parent"android:layout_height="match_parent"app:zxing_framing_rect_height="50dp"app:zxing_framing_rect_width="250dp" /><ing.QrViewandroid:id="@+id/zxing_viewfinder_view"android:layout_width="match_parent"android:layout_height="match_parent"app:zxing_possible_result_points="@color/colorPrimary"app:zxing_result_view="@color/zxing_custom_result_view"app:zxing_viewfinder_laser="@color/colorPrimary"app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" /><TextViewandroid:id="@+id/zxing_status_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|center_horizontal"android:layout_marginBottom="30dp"android:background="@color/zxing_transparent"android:text="@string/zxing_msg_default_status"android:textColor="@color/zxing_status_text" /></merge>

ScanActivity

import android.os.Bundle
import android.os.PersistableBundle
import android.view.KeyEvent
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.journeyapps.barcodescanner.CaptureManager
import kotlinx.android.synthetic.main.activity_scan.*class ScanActivity : AppCompatActivity() {private lateinit var captureManager: CaptureManageroverride fun onCreate(savedInstanceState: Bundle?) {Create(savedInstanceState)setContentView(R.layout.activity_scan)captureManager = CaptureManager(this, dbv)captureManager.initializeFromIntent(intent, savedInstanceState)captureManager.decode()}private val onBackListener: View.OnClickListener = View.OnClickListener { finish() }override fun onSaveInstanceState(outState: Bundle?,outPersistentState: PersistableBundle?) {SaveInstanceState(outState, SaveInstanceState(outState)}override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {KeyDown(keyCode, event) || KeyDown(keyCode, event)}override fun onPause() {Pause()Pause()}override fun onResume() {Resume()Resume()}override fun onDestroy() {Destroy()Destroy()}
}

l

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android=""xmlns:app=""android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"><com.journeyapps.barcodescanner.DecoratedBarcodeViewandroid:id="@+id/dbv"android:layout_width="match_parent"android:layout_height="match_parent"app:zxing_framing_rect_height="200dp"app:zxing_framing_rect_width="200dp"app:zxing_preview_scaling_strategy="fitXY"app:zxing_scanner_layout="@layout/view_qr"app:zxing_use_texture_view="true" /></RelativeLayout>

使用时调用

    val integrator = IntentIntegrator(this)//QR_CODE_TYPES 二维码integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);integrator.captureActivity = ScanActivity::class.javaintegrator.initiateScan()

返回结果

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {ActivityResult(requestCode, resultCode, data)// 跳转扫描页面返回扫描数据var scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);//  判断返回值是否为空if (scanResult != null) {//返回条形码数据var result = tsrefundsNumber.setText(result)ToastUtils.show(result)} else {ToastUtils.show("扫描失败")}}

本文发布于:2024-01-28 15:56:21,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064285888555.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:条形码   Android   ZXing
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23