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 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

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 自动代码规范检查工具Checkstyle
  3. android 中的PopupWindow 弹出菜单
  4. Android(安卓)NDK开发 native层获取Surface并显示图像 思路过程
  5. android中使用代码启动其他程序
  6. 【Android(安卓)开发教程】自定义服务
  7. Android(安卓)读取excel (支持 xls和xlsx)
  8. android 数字进度条--NumberProgressBar
  9. 《Beginning Android(安卓)Games》给出基本框架的实现(1)

随机推荐

  1. 关于Android(安卓)Paint.Cap枚举和Paint.
  2. Android游戏编程之音频编程
  3. Android(安卓)编程五要诀:Activity、Servi
  4. Android(安卓)面试那些事之Java基础
  5. 【Android7.1.2源码解析系列】Android编
  6. Android(安卓)绘制多个连续带数字圆圈。
  7. Android(安卓)Studio初使用之百度地图初
  8. .net开发者对android第二周的学习体会
  9. Android(安卓)手势操作GestureDetector
  10. Android中Bitmap内存占用分析