android studio 集成zxing二维码,条形码扫描

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24349695/article/details/79657004

android studio 集成zxing二维码,条形码扫描

android studio 集成zxing 扫描器 扫描框、扫描线定制样式

直接上代码。代码说明:

一、添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

二、配置app build.gradle

  compile 'com.google.zxing:core:3.2.1'
  compile 'com.journeyapps:zxing-android-embedded:3.5.0'

三、Activity使用

(1)Activity代码

public class SecondActivity extends AppCompatActivity {
    CompoundBarcodeView mBarcodeView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mBarcodeView = (CompoundBarcodeView) findViewById(R.id.dbv_custom);

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {


            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    1);
        } else {
            // Choose only one!!!这一个是扫描结果只会出来一次
            mBarcodeView.decodeSingle(callback);
            // Or这一是扫描结果一直会打印出来
            //mBarcodeView.decodeContinuous(callback);

        }

    }

    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            // Do something with the scanned QR code.
            // result.getText() returns decoded QR code.
            //mBarcodeView.
            System.out.println("______________________________"+result.getText());
           /* if(!TextUtils.isEmpty(result.getText())){
                mBarcodeView.decodeContinuous(null);
            }*/
        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    protected void onPause() {
        super.onPause();
        mBarcodeView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mBarcodeView.resume();
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Choose only one!!!
                mBarcodeView.decodeSingle(callback);
                // Or
                //mBarcodeView.decodeContinuous(callback);
                return;
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

(2)activity布局文件代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:gravity="center"
    >

    <com.journeyapps.barcodescanner.CompoundBarcodeView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/dbv_custom"
        app:zxing_scanner_layout="@layout/code_scanning_scanner"
        >
    </com.journeyapps.barcodescanner.CompoundBarcodeView>


</LinearLayout>

其中重点是 app:zxing_scanner_layout=”@layout/code_scanning_scanner”

code_scanning_scanner控制扫描页面的样式,下面重点解析。


(3)code_scanning_scanner代码

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.journeyapps.barcodescanner.BarcodeView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/zxing_barcode_surface"
        app:zxing_framing_rect_width="250dp"
        app:zxing_framing_rect_height="250dp"
        app:qrcv_animTime="1000"
        app:qrcv_borderColor="#00000000"
        app:qrcv_borderSize="1dp"
        app:qrcv_cornerColor="#ffffff"
        app:qrcv_cornerLength="20dp"
        app:qrcv_cornerSize="3dp"
        app:qrcv_maskColor="#33FFFFFF"
        app:qrcv_rectWidth="220dp"
        app:qrcv_scanLineColor="#ffffff"
        app:qrcv_scanLineSize="1dp"
        app:qrcv_topOffset="100dp"
        />

    <com.ljm.zxing.ScanView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/zxing_viewfinder_view"
        app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
        app:zxing_result_view="@color/zxing_custom_result_view"
        app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
        app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/>

    <TextView
        android:id="@+id/zxing_status_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:background="@color/zxing_transparent"
        android:text="@string/zxing_msg_default_status"
        android:textColor="@color/zxing_status_text"/>

</merge>

com.ljm.zxing.ScanView是自定义控件,控制扫描框,扫描线等样式
(4)ScanView代码

package com.ljm.zxing;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import com.journeyapps.barcodescanner.CameraPreview;
import com.journeyapps.barcodescanner.ViewfinderView;

/**
 * Created by BettyLi on 2018/3/22.
 * 重写ViewfinderView设置扫描框的样式,四个角和扫描线样式
 */

public class ScanView extends ViewfinderView  {

    protected static final int CURRENT_POINT_OPACITY = 0xA0;
    protected Bitmap resultBitmap;
    protected final Paint paint;
    protected CameraPreview cameraPreview;
    protected Rect framingRect;
    protected Rect previewFramingRect;
    private int i=0;
    private int ScreenRate;

    /**
     * 四个绿色边角对应的宽度
     */
    private static final int CORNER_WIDTH = 10;
    /**
     * 手机的屏幕密度
     */
    private static float density;



    public ScanView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //四个绿色边角
        density = context.getResources().getDisplayMetrics().density;
        //将像素转换成dp
        ScreenRate = (int)(20 * density);
    }

    public void setCameraPreview(CameraPreview view) {
        this.cameraPreview = view;
        view.addStateListener(new CameraPreview.StateListener() {
            @Override
            public void previewSized() {
                refreshSizes();
                invalidate();
            }

            @Override
            public void previewStarted() {

            }

            @Override
            public void previewStopped() {

            }

            @Override
            public void cameraError(Exception error) {

            }

            @Override
            public void cameraClosed() {

            }
        });
    }

    protected void refreshSizes() {
        if(cameraPreview == null) {
            return;
        }
        Rect framingRect = cameraPreview.getFramingRect();
        Rect previewFramingRect = cameraPreview.getPreviewFramingRect();
        if(framingRect != null && previewFramingRect != null) {
            this.framingRect = framingRect;
            this.previewFramingRect = previewFramingRect;
        }
    }

    @SuppressLint("DrawAllocation")
    @Override
    public void onDraw(Canvas canvas) {
        refreshSizes();
        if (framingRect == null || previewFramingRect == null) {
            return;
        }
        Rect frame = framingRect;
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        paint.setColor(resultBitmap != null ? resultColor : maskColor);
        canvas.drawRect(0, 0, width, frame.top, paint);
        canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
        canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
        canvas.drawRect(0, frame.bottom + 1, width, height, paint);
        if (resultBitmap != null) {
            paint.setAlpha(CURRENT_POINT_OPACITY);
            canvas.drawBitmap(resultBitmap, null, frame, paint);
        }else{
            drawFrameCorner(canvas, frame);
            drawLaserLine(canvas, frame);//绘制扫描线
        }

    }

    /**
     * 画扫描线
     *
     * @param canvas
     * @param frame
     */
    private void drawLaserLine(Canvas canvas, Rect frame) {


        if ((i += 5) < frame.bottom - frame.top) {

        } else {
            i = 0;
        }
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.GREEN);// 设置扫描线颜色
        canvas.drawRect(frame.left - 1, frame.top + i - 1, frame.right + 1,frame.top + 1 + i, paint);
        // 刷新
        invalidate();
    }

    /**
     * 绘制扫描框4角
     *
     * @param canvas
     * @param frame
     */
    private void drawFrameCorner(Canvas canvas, Rect frame) {

        //画扫描框边上的角,总共8个部分
        paint.setColor(Color.GREEN);
        canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,
                frame.top + CORNER_WIDTH, paint);
        canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top
                + ScreenRate, paint);
        canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,
                frame.top + CORNER_WIDTH, paint);
        canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top
                + 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);

    }
    public void drawViewfinder() {
        Bitmap resultBitmap = this.resultBitmap;
        this.resultBitmap = null;
        if (resultBitmap != null) {
            resultBitmap.recycle();
        }
        invalidate();
    }
    public void drawResultBitmap(Bitmap result) {
        resultBitmap = result;
        invalidate();
    }
}

源码地址https://download.csdn.net/download/qq_24349695/10302772

猜你喜欢

转载自blog.csdn.net/qq_24349695/article/details/79657004
今日推荐