android二维码扫描界面绘制demo
Android超简易Zxing框架生成二维码+扫码功能

Android超简易Zxing框架⽣成⼆维码+扫码功能zxing是⼀个⼆维码的框架。
配置1、implementation 'com.journeyapps:zxing-android-embedded:4.1.0'如果报错在这个⽂件的android下加上如下配置,让其⽀持Java1.8,不然只有1.7、1.6(可在'app'右键---->open module settings------>Module看到)compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}2、<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" /><uses-permission android:name="android.permission.CAMERA"/>记得点击Sync Now⽣成⼆维码步骤:1、⾃定义⼀个负责⽣成⼆维码的类,⽅便调⽤,返回⼀个Bitmap要点:利⽤Zxing中的BarcodeEncoder的encodeBitmap⽅法public Bitmap encodeBitmap(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints) throws WriterException encodeBitmap⽅法参数内容contents码的内容format码的类型(⼆维码、条形码…)width码的宽度height码的⾼度hints码的额外参数Map<EncodeHintType, ?> hints码的额外参数这⾥列举了⼀些常⽤的这些都是Zxing中定义好的参数内容EncodeHintType.ERROR_CORRECTION设置容错率 L>M>Q>H 等级越⾼扫描时间越长,准确率越⾼EncodeHintType.CHARACTER_SET设置字符集EncodeHintType.MARGIN设置边距QRcode类package com.example.xianyu;import android.graphics.Bitmap;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.WriterException;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import com.journeyapps.barcodescanner.BarcodeEncoder;import java.util.HashMap;import java.util.Map;public class QRcode{public Bitmap qrcode(String content){int width = 400;int height = 400;//HashMap设置⼆维码参数Map map = new HashMap();// 设置容错率 L>M>Q>H 等级越⾼扫描时间越长,准确率越⾼map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置字符集map.put(EncodeHintType.CHARACTER_SET,"utf-8");//设置外边距map.put(EncodeHintType.MARGIN,1);//利⽤编码器,⽣成⼆维码BarcodeEncoder barcodeEncoder = new BarcodeEncoder();Bitmap bitmap = null;try {bitmap = barcodeEncoder.encodeBitmap(content, BarcodeFormat.QR_CODE, width, height,map);} catch (WriterException e) {e.printStackTrace();}return bitmap;}}2、在要⽣成⼆维码的Activity,调⽤上述类,输⼊⼆维码内容⽣成⼆维码,之后显⽰在ImageView组件上MainActivitypublic class MainActivity extends AppCompatActivity {ImageView Code;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Code = findViewById(R.id.iv_code);QRcode qrcode = new QRcode();Bitmap bitmap= qrcode.qrcode("CSDN");Code.setImageBitmap(bitmap);}成功获得⼆维码内容扫码步骤:1、给点击扫码的组件添加点击监听事件2、在监听事件中,利⽤Intent和startActivityForResult跳到Zxing定义好的默认的扫码界⾯CaptureActivity中(也可以⾃定义扫码界⾯)3、重写onActivityResult⽅法处理⼆维码返回的内容要点:其中的REQUEST_CODE Zxing是定义好的,⼀定要使⽤这个CODE不然在onActivityResult⽅法中解析⼆维码将会不起作⽤IntentIntegrator.parseActivityResult(requestCode, resultCode, data);这段源码可知REQUEST_CODE要相等才会进⾏⼆维码解析,否则将会返回 nullpublic static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) {if (requestCode == REQUEST_CODE) {return parseActivityResult(resultCode, intent);}return null;}设置监听:Code.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this, CaptureActivity.class);startActivityForResult(intent,REQUEST_CODE);}});重写Activity中的onActivityResult得到⼆维码内容,我这⾥只是将获得的内容进⾏简单的输出@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);if(result != null) {if(result.getContents() == null) {Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();} else {Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();}} else {super.onActivityResult(requestCode, resultCode, data);}}总结到此这篇关于Android 超简易Zxing框架⽣成⼆维码+扫码功能的⽂章就介绍到这了,更多相关Android Zxing框架⽣成⼆维码+扫码内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Vue实现手机扫描二维码预览页面效果

Vue实现⼿机扫描⼆维码预览页⾯效果本⽂实例为⼤家分享了Vue实现⼿机扫描⼆维码预览页⾯的具体代码,供⼤家参考,具体内容如下背景:vue-cli3 + ant-design-vue 搭建的后台管理系统需求:实现扫描⼆维码即可在⼿机预览H5页⾯功能使⽤插件:qrcodestep1:安装插件npm install qrcode --savestep2:引⼊插件在项⽬中新建QRcode.vue⽂件<template><div id="qrCode"><div id="code"></div><canvas id="canvas"></canvas></div></template><script>import QRCode from "qrcode";export default {props: {url: {type: String}},data() {return {msg: "hello vue",codes: ""};},components: {QRCode: QRCode},methods: {useqrcode() {var canvas = document.getElementById("canvas");QRCode.toCanvas(canvas, this.url, function(error) {if (error) console.error(error);});}},mounted() {eqrcode();}};</script><style lang="stylus" scoped>#qrCode {text-align: center;}</style>step3:在需要使⽤该插件的地⽅引⼊例如:<template><div><QRcode :url='url'/></div></template><script>import QRcode from '../../QRcode.vue'export default {components: {QRcode},data() {return {url:'(需要⽣成⼆维码的⽹址)'}}}</script>更多⽂章可以点击《》学习阅读。
基于Android的二维码生成和扫描工具的设计与实现

基于Android的二维码生成和扫描工具的设计与实现关键词:Android 二维码生成二维码扫描目录摘要 .................................................................................................... 错误!未定义书签。
Abstract ............................................................................................. 错误!未定义书签。
绪论 .. (1)1 开发环境 (3)1.1 开发工具简介 (3)1.1.1 Eclipse简介 (3)1.1.2 JDK简介 (3)1.1.3 Android SDK简介 (3)1.1.4 ADT简介 (4)1.2 环境搭建 (4)1.2.1 下载安装JDK (4)1.2.2 下载安装Android SDK (4)1.2.3 安装Eclipse和ADT (5)2 系统分析 (6)2.1 系统开发目标 (6)2.2 系统需求分析 (6)2.2.1 用户需求分析 (6)2.2.2 功能需求分析 (7)2.3 可行性分析 (7)3 系统设计 (9)3.1 总体设计 (9)3.2 系统概要设计 (10)3.2.1 系统模块结构设计 (11)3.2.2 计算机物理系统配置方案设计 (11)4 系统详细设计 (12)4.1 系统的功能设计 (12)4.1.1 生成功能设计 (12)4.1.2 识别功能设计 (12)4.2 界面设计 (13)4.2.1 主界面设计 (13)4.2.2 生成界面的设计 (13)4.2.3 保存界面的设计 (13)4.2.4 识别界面的设计 (13)5 系统实现 (14)5.1 Android系统工程文件组成 (14)5.2 Intent的使用 (14)5.3 ZXing的使用 (15)5.4 编码与实现 (15)5.4.1 生成功能的实现 (17)5.4.2 保存功能的实现 (17)5.4.3 识别功能的实现 (18)结论 (22)致谢 .................................................................................................... 错误!未定义书签。
Android实现扫描二维码功能

Android实现扫描⼆维码功能本⽂实例为⼤家分享了Android实现扫描⼆维码的具体代码,供⼤家参考,具体内容如下1.效果图:2.引⽤公共库:builder.radle,在app⽬录下implementation 'com.google.android.gms:play-services-maps:17.0.0'implementation 'com.google.android.gms:play-services-vision:19.0.0'implementation 'com.google.android.gms:auth-api-impl:11.6.0'3.清单⽂件,拍照权限申请<uses-permission android:name="android.permission.CAMERA" />4.主界⾯:package com.example.administrator.testz;import android.Manifest;import android.app.Activity;import android.content.ActivityNotFoundException;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.pm.PackageManager;import android.content.res.Resources;import .Uri;import android.os.Bundle;import android.os.PersistableBundle;import android.os.Vibrator;import android.util.Log;import android.util.SparseArray;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.TextView;import com.google.android.gms.vision.CameraSource;import com.google.android.gms.vision.Detector;import com.google.android.gms.vision.barcode.Barcode;import com.google.android.gms.vision.barcode.BarcodeDetector;import java.io.IOException;import java.util.ArrayList;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;public class MainActivity extends AppCompatActivity {SurfaceView surfaceView;CameraSource cameraSource;TextView qrCodeText;BarcodeDetector barcodeDetector;public static ArrayList<String> scannList;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);surfaceView = (SurfaceView) findViewById(R.id.qrView);qrCodeText = (TextView) findViewById();scannList = new ArrayList<>();barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();cameraSource = new CameraSource.Builder(this, barcodeDetector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return;}try {cameraSource.start(holder);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {cameraSource.stop();}});barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {@Overridepublic void release() {}@Overridepublic void receiveDetections(Detector.Detections<Barcode> detections) {final SparseArray<Barcode> qrCode = detections.getDetectedItems();if (qrCode.size() != 0) {qrCodeText.post(new Runnable() {@Overridepublic void run() {qrCodeText.setText(qrCode.valueAt(0).displayValue);addInList(qrCode.valueAt(0).displayValue);}});}}});}private void addInList(String scannResult) {if (scannList.isEmpty()) {scannList.add(scannResult);} else {String a = scannList.get(scannList.size() - 1);if (!a.equals(scannResult)) {scannList.add(scannResult);}}for (String s : scannList) {Log.e("s", "onCreate: " + s);}Log.e("size", "addInList: " + scannList.size());}@Overrideprotected void onDestroy() {super.onDestroy();}}5.布局页⾯:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.administrator.testz.MainActivity"><SurfaceViewandroid:id="@+id/qrView"android:layout_width="300dp"android:layout_height="300dp"android:layout_marginStart="32dp"android:layout_marginLeft="32dp"android:layout_marginEnd="32dp"android:layout_marginRight="32dp"android:orientation="vertical" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="TextView"android:textSize="30sp" /></RelativeLayout>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Androidstudio实现手机扫描二维码功能

Androidstudio实现⼿机扫描⼆维码功能安卓⼿机版本在6.0以后需要动态获取相机权限1.获取相机权限<!-- 获取⼿机相机的权限 --><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.FLASHLIGHT" />2.添加依赖implementation 'cn.yipianfengye.android:zxing-library:2.2'3.activity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="wrap_content"android:layout_gravity="center"android:layout_height="wrap_content"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开启相机扫描"android:id="@+id/btn"/></LinearLayout>4.MainActivity.javapackage com.example.a86156.saomiao;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.uuzuche.lib_zxing.activity.CaptureActivity;import com.uuzuche.lib_zxing.activity.CodeUtils;import com.uuzuche.lib_zxing.activity.ZXingLibrary;public class MainActivity extends AppCompatActivity {Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//隐藏系统默认的标题ActionBar actionBar = getSupportActionBar();if(actionBar!=null){actionBar.hide();}//初始化相机权限ZXingLibrary.initDisplayOpinion(this);btn = findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//先判断⼿机版本是否在6.0以上,如果在6.0以上则需要动态申请权限if (Build.VERSION.SDK_INT > 22) {if (ContextCompat.checkSelfPermission(MainActivity.this,android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//先判断有没有权限,没有就在这⾥进⾏权限的申请ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.CAMERA}, 1);} else {//说明已经获取到摄像头权限了想⼲嘛⼲嘛Intent intent = new Intent(MainActivity.this, CaptureActivity.class);startActivityForResult(intent, 1);}} else {//这个说明系统版本在6.0之下,不需要动态获取权限。
移动应用开发二维码扫描集成教程

移动应用开发二维码扫描集成教程如何集成二维码扫描功能到移动应用开发中近年来,二维码扫描已经成为一种普遍使用的技术,它方便了用户获取信息以及进行各种交互操作。
无论是购物、支付、登录还是添加好友,二维码扫描都能提供便捷的解决方案。
本文旨在探讨如何将二维码扫描功能集成到移动应用开发中,并为开发者提供一份简明扼要的教程。
首先,为了集成二维码扫描功能,我们需要选择一个合适的二维码扫描库。
目前市面上有许多可供选择的库,如ZBar、ZXing等。
这些库提供了丰富的功能,可以方便地实现二维码的扫描和解码。
在选择库时,我们应该考虑到库的稳定性、易用性以及开源社区的支持程度。
接下来,我们需要在移动应用中引入所选的二维码扫描库。
这可以通过在应用的build.gradle文件中添加相应的依赖来实现。
例如,如果我们选择了ZXing库,我们可以添加以下依赖:implementation 'com.google.zxing:core:3.4.0'implementation 'com.journeyapps:zxing-android-embedded:3.6.0'引入依赖后,我们就可以在应用中使用二维码扫描功能了。
首先,我们需要创建一个扫描界面,可以使用系统提供的CameraView来显示摄像头画面。
在界面上,我们可以添加一个扫描按钮,点击按钮后即可开始扫描。
我们还可以添加一些自定义的界面元素,如扫描框、闪光灯按钮等,以提升用户体验。
当用户点击扫描按钮后,我们需要调用二维码扫描库提供的接口来实现真正的扫描功能。
通常情况下,我们可以通过调用库中的CaptureActivity来开启扫描界面,并在扫描成功后获取到扫描结果。
例如,使用ZXing库,我们可以通过以下代码来实现二维码扫描:IntentIntegrator integrator = new IntentIntegrator(this);integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);integrator.setPrompt("请将二维码对准扫描框");integrator.setCameraId(0); // 设置使用后置摄像头integrator.setBeepEnabled(false); // 关闭扫描成功的声音提示integrator.initiateScan();扫描成功后,我们可以通过重写Activity的onActivityResult方法来获取扫描结果。
Android平台生成二维码并实现扫描识别功能

Android平台⽣成⼆维码并实现扫描识别功能1.⼆维码的前世今⽣“⼆维条码/⼆维码(2-dimensional bar code)是⽤某种特定的⼏何图形按⼀定规律在平⾯(⼆维⽅向上)分布的⿊⽩相间的图形记录数据符号信息的;在代码编制上巧妙地利⽤构成计算机内部逻辑基础的“0”、“1”⽐特流的概念,使⽤若⼲个与⼆进制相对应的⼏何形体来表⽰⽂字数值信息,通过图象输⼊设备或光电扫描设备⾃动识读以实现信息⾃动处理:它具有条码技术的⼀些共性:每种码制有其特定的字符集;每个字符占有⼀定的宽度;具有⼀定的校验功能等。
同时还具有对不同⾏的信息⾃动识别功能、及处理图形旋转变化点。
[1] ”上⾯是百度百科的解释。
既然有⼆维码,那么肯定有⼀维码。
⼀维码。
最为常见的就是⾷品 & 书本后⾯的条码。
条码起源与20世纪40年代,后来在1970年 UPC码发明,并开始⼴泛应⽤与⾷品包装。
具体的介绍可以看百度百科⼀维码。
其实⼆维码与⼀维码本质上是类似的,就跟⼀维数组和⼆维数组⼀样。
2.⼆维码的java⽀持库为了让java或者说android⽅便继承条码的功能,google就开发了⼀个zxing的库:3.⽣成⼆维码public class EncodeThread {public static void encode(final String url, final int width, final int height, final EncodeResult result) {if (result == null) {return;}if (TextUtils.isEmpty(url)) {result.onEncodeResult(null);return;}new Thread() {@Overridepublic void run() {try {MultiFormatWriter writer = new MultiFormatWriter();Hashtable<EncodeHintType, String> hints = new Hashtable<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, width, height, hints);Bitmap bitmap = parseBitMatrix(bitMatrix);result.onEncodeResult(bitmap);return;} catch (WriterException e) {e.printStackTrace();}result.onEncodeResult(null);}}.start();}/*** ⽣成⼆维码内容<br>** @param matrix* @return*/public static Bitmap parseBitMatrix(BitMatrix matrix) {final int QR_WIDTH = matrix.getWidth();final int QR_HEIGHT = matrix.getHeight();int[] pixels = new int[QR_WIDTH * QR_HEIGHT];//this we using qrcode algorithmfor (int y = 0; y < QR_HEIGHT; y++) {for (int x = 0; x < QR_WIDTH; x++) {if (matrix.get(x, y)) {pixels[y * QR_WIDTH + x] = 0xff000000;} else {pixels[y * QR_WIDTH + x] = 0xffffffff;}}}Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);return bitmap;}public interface EncodeResult {void onEncodeResult(Bitmap bitmap);}}zxing ⽀持很多条码格式:我们这⾥使⽤QR_CODE码。
Android实现扫描和生成二维码

Android实现扫描和⽣成⼆维码本⽂实例为⼤家分享了Android实现扫描和⽣成⼆维码的具体代码,供⼤家参考,具体内容如下需求:就是需要把数据存放到⼆维码中,然后通过扫描⼆维码拿到数据,并展⽰到页⾯上。
功能展⽰:demo下载:代码实现:1.引⽤第三⽅//AndroidX 版本implementation 'com.king.zxing:zxing-lite:1.1.7-androidx'2.在AndroidManifest.xml 声明CaptureActivity<activityandroid:name="com.king.zxing.CaptureActivity"android:screenOrientation="fullSensor"android:theme="@style/CaptureTheme" />3.主要代码import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import com.king.zxing.CaptureActivity;import com.king.zxing.util.CodeUtils;import org.json.JSONObject;import static com.king.zxing.CaptureFragment.KEY_RESULT;public class MainActivity extends AppCompatActivity implements View.OnClickListener { protected EditText edtResutlt;protected Button btnScan;protected Button btnCreate;protected EditText edtData;protected ImageView ivQr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(yout.activity_main);PermissionUtils.applyPermission(this);initView();}@Overridepublic void onClick(View view) {if (view.getId() == R.id.btn_scan) {//跳转到扫描界⾯Intent intent = new Intent(this, CaptureActivity.class);startActivityForResult(intent, 1);} else if (view.getId() == R.id.btn_create) {String data = edtData.getText().toString().trim();if (TextUtils.isEmpty(data)) {Toast.makeText(this, "请输⼊⽂字", Toast.LENGTH_SHORT).show();} else {//⽣成⼆维码Bitmap qrCode = CodeUtils.createQRCode(data, 600, null);ivQr.setImageBitmap(qrCode);}}}/*** 在该⽅法中拿到扫描的数据* @param requestCode* @param resultCode* @param data*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {if (requestCode == 1) {String result = data.getStringExtra(KEY_RESULT);Log.e("aaa", "resu-->" + result);//展⽰到页⾯上edtResutlt.setText(result);}}}private void initView() {edtResutlt = (EditText) findViewById(R.id.edt_resutlt);btnScan = (Button) findViewById(R.id.btn_scan);btnScan.setOnClickListener(MainActivity.this);btnCreate = (Button) findViewById(R.id.btn_create);btnCreate.setOnClickListener(MainActivity.this);edtData = (EditText) findViewById(R.id.edt_data);ivQr = (ImageView) findViewById(R.id.iv_qr);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package com.mcj.codescan;
import com.mcj.android.camera.CameraManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class CaptureRectView extends View {
public final static int scanStep = 5;
public final static long INVALI_DELAY_TIME = 50;
public int scanLineBase;
private Paint mpaint;
private Rect frameRect;// 矩形框坐标,以activity方向为基准坐标
private int screanHeight;// 窗口高度,以activity方向为基准
private int screanWidth;// 窗口宽度,以activity方向为基准
public CaptureRectView(Context context, AttributeSet attrs) {
super(context, attrs);
mpaint = new Paint();
scanLineBase = 1;
}
@Override
protected void onDraw(Canvas canvas) {
frameRect = CameraManager.get().getFramingRect();
if (frameRect == null
|| CameraManager.get().getConfigManager().getScreenResolution() == null) return;
if (screanWidth == 0 || screanHeight == 0) {
screanWidth = CameraManager.get().getConfigManager()
.getScreenResolution().x;
screanHeight = CameraManager.get().getConfigManager()
.getScreenResolution().y;
}
drawBox(canvas);
drawFocusBox(canvas);
drawShadow(canvas);
drawScanLine(canvas);
postInvalidateDelayed(INVALI_DELAY_TIME, frameRect.left, frameRect.top,
frameRect.right, frameRect.bottom);
super.onDraw(canvas);
}
/**
* 绘制黑色外框
*
* @param canvas
*/
private void drawBox(Canvas canvas) {
mpaint.setARGB(255, 0, 0, 0);
mpaint.setStyle(Paint.Style.FILL);
mpaint.setStrokeWidth(2.0f);
canvas.drawRect(frameRect.left, frameRect.top, frameRect.right + 1, frameRect.top + 2, mpaint);
canvas.drawRect(frameRect.left, frameRect.top + 2, frameRect.left + 2, frameRect.bottom - 1, mpaint);
canvas.drawRect(frameRect.right - 1, frameRect.top,
frameRect.right + 1, frameRect.bottom - 1, mpaint);
canvas.drawRect(frameRect.left, frameRect.bottom - 1,
frameRect.right + 1, frameRect.bottom + 1, mpaint);
}
/**
* 绘制绿色聚焦框
*
* @param canvas
*/
private void drawFocusBox(Canvas canvas) {
float strokeWidth = 5.0f;
mpaint.setARGB(255, 0, 255, 0);
mpaint.setStyle(Paint.Style.FILL);
mpaint.setStrokeWidth(strokeWidth);
float left = frameRect.left - strokeWidth;
float right = frameRect.right + strokeWidth;
float top = frameRect.top - strokeWidth;
float buttom = frameRect.bottom + strokeWidth;
float length = 0.1f * screanWidth;
canvas.drawLine(left - strokeWidth / 2, top, left + length, top, mpaint);
canvas.drawLine(left, top - strokeWidth / 2, left, top + length, mpaint);
canvas.drawLine(right + strokeWidth / 2, top, right - length, top,
mpaint);
canvas.drawLine(right, top - strokeWidth / 2, right, top + length,
mpaint);
canvas.drawLine(left - strokeWidth / 2, buttom, left + length, buttom, mpaint);
canvas.drawLine(left, buttom + strokeWidth / 2, left, buttom - length, mpaint);
canvas.drawLine(right + strokeWidth / 2, buttom, right - length,
buttom, mpaint);
canvas.drawLine(right, buttom + strokeWidth / 2, right,
buttom - length, mpaint);
}
/**
* 绘制box外阴影
*
* @param canvas
*/
private void drawShadow(Canvas canvas) {
mpaint.setARGB(150, 0, 0, 0);
mpaint.setStyle(Paint.Style.FILL);
mpaint.setStrokeWidth(4.0f);
canvas.drawRect(0, 0, frameRect.left, screanHeight, mpaint);
canvas.drawRect(frameRect.left, 0, frameRect.right, frameRect.top,
mpaint);
canvas.drawRect(frameRect.left, frameRect.bottom, frameRect.right, screanHeight, mpaint);
canvas.drawRect(frameRect.right, 0, screanWidth, screanHeight, mpaint); }
/**
* 画扫描线
*
* @param canvas
*/
private void drawScanLine(Canvas canvas) {
int alpha = 255;
mpaint.setStyle(Paint.Style.FILL);
mpaint.setStrokeWidth(1.0f);
for (int sacnShadow = 0; sacnShadow < 51; sacnShadow++) {
if (scanLineBase - sacnShadow < 0)
break;
mpaint.setARGB(alpha, 0, 255, 0);
canvas.drawLine(frameRect.left + 1, frameRect.top + scanLineBase
- sacnShadow, frameRect.right - 1, frameRect.top
+ scanLineBase - sacnShadow, mpaint);
alpha = alpha - 5;
}
scanLineBase = (scanLineBase + scanStep) % (frameRect.height());
}
}。