uniapp中应用H5自定义二维码扫码界面

标签: Uniapp  Vue  uniapp  vue  barcode

uniapp中应用H5自定义二维码扫码界面

最终效果

效果图

pages配置

{
	"path": "components/barcode/scan-page",
	"style": {
		"navigationBarTitleText": "扫一扫"
	}
}

组件代码

<template>

	<view>
		<!-- 扫码页面 -->
		<!-- #ifndef APP-PLUS -->
		<view class="wrap">
			<view class="u-tips-color">
				请在app中打开
			</view>
		</view>
		<!-- #endif -->
	</view>
</template>

<script>
	export default {
		data() {
			return {
				barcode: null,
				flash: false,
				tip: '将二维码放入框中,即可自动扫描',
			}
		},
		onShow() {
			// 页面展示时,重新启动扫描检测
			if (this.barcode) {
				this.barcode.start()
			}
		},
		onLoad(params) {
			const {
				tip
			} = params
			if (tip) {
				this.tip = tip
			}
			// #ifdef APP-PLUS
			plus.navigator.setFullscreen(true); //全屏
			let currentWebview = this.$scope.$getAppWebview();
			this.createBarcode(currentWebview)
			this.createTipInfoView(currentWebview)
			this.createFlashBarView(currentWebview)
			// #endif
		},
		mounted() {

		},
		methods: {
			/**
			 * 创建二维码
			 * @param {Object} currentWebview
			 */
			createBarcode(currentWebview) {
				if (!this.barcode) {
					this.barcode = plus.barcode.create('barcode', [plus.barcode.QR], {
						top: `0px`,
						left: '0px',
						height: `100%`,
						width: '100%',
						position: 'absolute',
						background: '#FFCC00',
						frameColor: '#FFCC33',
						scanbarColor: '#FFCC33',
					});
					this.barcode.onmarked = this.onmarked;
					this.barcode.setFlash(this.flash);
					//此处未演示扫码成功回调的地址设置,实际请参考HTML5Plus API自行处理  
					//注意扫码区域需为正方形,否则影响扫码识别率  
					currentWebview.append(this.barcode);
				}
				this.barcode.start()
			},

			/**
			 * 创建提示信息
			 * @param {Object} currentWebview
			 */
			createTipInfoView(currentWebview) {
				const content = new plus.nativeObj.View('content', {
						top: '0px',
						left: '0px',
						height: '100%',
						width: '100%'
					},
					[{
						tag: 'font',
						id: 'scanTips',
						text: this.tip,
						textStyles: {
							size: '14px',
							color: '#ffffff',
							whiteSpace: 'normal'
						},
						position: {
							top: '90px',
							left: '10%',
							width: '80%',
							height: 'wrap_content'
						}
					}]);
				currentWebview.append(content);

			},
			// 创建 开关灯按钮
			createFlashBarView(currentWebview) {

				const openImg = this.crtFlashImg('static/yellow-scanBar.png')
				const closeImg = this.crtFlashImg('static/scanBar.png')
				const scanBarVew = new plus.nativeObj.View('scanBarVew', {
						top: '65%',
						left: '40%',
						height: '10%',
						width: '20%',
					},
					closeImg);
				scanBarVew.interceptTouchEvent(true);

				currentWebview.append(scanBarVew);

				scanBarVew.addEventListener("click", (e) => { //点亮手电筒
					this.flash = !this.flash;
					if (this.flash) {
						scanBarVew.draw(openImg);
					} else {
						scanBarVew.draw(closeImg)
					}
					if (this.barcode) {
						this.barcode.setFlash(this.flash);
					}
				}, false)
			},
			crtFlashImg(imgsrc) {
				return [{
					tag: 'img',
					id: 'scanBar',
					src: imgsrc,
					position: {
						width: '28%',
						left: '36%',
						height: '30%'
					}
				}, {
					tag: 'font',
					id: 'font',
					text: '轻触照亮',
					textStyles: {
						size: '10px',
						color: '#ffffff'
					},
					position: {
						width: '80%',
						left: '10%'
					}
				}]
			},
			// 扫码成功回调
			onmarked(type, result) {
				console.log('条码类型:' + type);
				console.log('条码内容:' + result);
				// 业务代码
				// 核对扫描结果
				// 判断是否是正确的格式
				// 不正确则跳转到 错误页面
					
			}

		}
	}
</script>

<style scoped>
	.wrap {
		height: calc(100vh);
		/* #ifdef H5 */
		height: calc(100vh - var(--window-top));
		/* #endif */
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
	}
</style>

参考资料
h5 barcode

版权声明:本文为heshuncheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/heshuncheng/article/details/108515444

智能推荐

使用@Slf4j的正确方法

环境说明 Windows 10 1803 IDEA 2018.2.EAP Maven 3.5.2 这是正文 POM文件 这里要吐槽一下,其实不想写这篇的,因为网上一搜有很多,但是,我真的被坑到了,很多篇教程都是复制,依赖不全,导致我总是运行不了。教程教程,就是给人学习的,你不能默认你的读者掌握了其他相关的东西。 好了,在pom中添加上面的所有依赖,很多教程里都只说添加lombok依赖就行了,其实不...

2020南京邮电大学Mooc—在线期末考试主观卷

为客观卷部分,自取。 2020南京邮电大学Mooc—在线期末考试客观卷 1 ( 20分 ) 请对序列进行快速排序,写出前5趟的排序过程,按照如下答题格式进行答题,答题时注意不要漏掉下划线,下划线标错扣分。 答题格式: 第1趟: 第2趟:____________________________ 第3趟:____________________________ 第4趟:__________...

入门图论、图论的一些基本概念及实战

图论的一些基本概念及实战 基本概念 主要思想 实战 例题1-无向图的广深优先遍历 例题2--有向图的深度优先遍历(城市地图) 例题3--最少转机 基本概念 图就是有N个顶点和M条边组成的集合。图分为有向图和无向图,如果给图的每条边规定一个方向,那么得到的图称为有向图,其他边也称为有向边。在有向图中,与一个点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。边没有方向的图称为...

maven 保姆教程

什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。 以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多...

动态规划类问题解题步骤 --附例题(小偷问题)

动态规划类问题解题步骤 --附例题(小偷问题) 动态规划 基本思想 适用情况 优点 解题步骤 实例分析 问题 解题步骤 动态规划 基本思想 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。 适用情况 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优...

猜你喜欢

C++:点 线 位置关系

一、不带方向        分享给有需要的人,代码质量勿喷 二、带方向  左右位置 2.1 ΔX=0            2.2 ΔX>0 2.3 ΔX<0 分享给有需要的人,代码质量勿喷  ...

从Java到Android_Java基础_6.Java数组

6.Java数组 一、数组 1.使用数组的原因 2.什么是数组 3.数组声明 4.数组创建 5.数组在内存中的存储 6.局部变量和数组的默认值 7.数组的初始化 8.数组元素的引用 9.数组长度 二、一维数组 1.默认值 2.循环赋值 3.循环输出 4.数组下标越界异常 三、应用 1.求整数数组的累加和 2.求数组元素最大值 四、增强型for循环 1.增强型for循环 2.foreach循环应用 ...

通过修改MotorControl Workbench生成的程序来改变死区时间

本例程是基于MotorControl Workbench 5.2.0版本生成的HALL传感器的FOC控制程序。 程序的修改是在drive_parameters.h文件里211行处,如下图:...

vue组件中使用的一些细节点

1. 在table/ul/ol/select中显示子组件 bug 效果如下,我们会发现出现了…跑到tbody外面和table同级的情况,违反了H5的要求,即tr必须在tbody中,tbody必须在table中。: 解决 2. 子组件中的data函数 在子组件中data应该是一个函数,而不是一个对象;在根组件里data定义为一个对象; 是因为子组件也许会被调用多次,这样定义使每一个子组...

Redis进阶 -CLUSTER NODES 信息结合实际输出信息解读

文章目录 Pre cluster nodes 作用 输出格式 flags 含义 slot 第一种 单哈希槽 第二种 Range 第三种特殊状态 导入和迁移 Pre Redis进阶 - 因异常断电导致的Redis Cluster Fail故障处理 处理了redis cluster 断电后的异常,中间使用了cluster nodes 命令,我们来看下这个命令的组成 cluster nodes Redi...