記錄--uni-app App端半屏連續(xù)掃碼
這里給大家分享我在網(wǎng)上總結(jié)出來(lái)的一些知識(shí),希望對(duì)大家有所幫助
本文用一個(gè)簡(jiǎn)單的 demo 講解 App端 半屏連續(xù)掃碼 的實(shí)現(xiàn)方式,包括(條形碼、二維碼等各種各樣的碼)。
我會(huì)從實(shí)現(xiàn)思路講起,如果你比較急可以直接跳到 動(dòng)手實(shí)現(xiàn) 章節(jié)獲取代碼。
開發(fā)和運(yùn)行環(huán)境
需求收集
看到論壇上有人想在 App端 實(shí)現(xiàn) 連續(xù)掃碼 功能。
認(rèn)真看了下圖,還是個(gè) 半屏 的掃碼框。


只是看到提了下需求,并沒(méi)搜到多少解決方案。
于是我去 uni-app官網(wǎng) 看了下,找到相關(guān)的內(nèi)容:
但 <camera> 組件不支持 App 端使用(至少在寫本文時(shí)不支持);
uni.scanCode 可以掃碼,但會(huì)跳到另一個(gè)界面,并在全屏的模式下掃碼,也不支持連續(xù)掃碼。
當(dāng)然,用 uni.scanCode 可以在掃碼成功后再重新執(zhí)行一次,這樣就能實(shí)現(xiàn)連續(xù)掃碼的功能,但界面會(huì)跳來(lái)跳去(跳到掃碼界面,成功后又跳回app的界面,再執(zhí)行又跳到掃碼界面......)。
提煉需求
根據(jù)上面的信息,提煉出3個(gè)關(guān)鍵詞:
- App端
- 半屏
- 連續(xù)掃碼
我采用了 DCLOUD社區(qū) 《uni-app怎么自定義掃碼和連續(xù)掃》 里的需求。粗略的寫了下布局(我沒(méi)有精細(xì)寫樣式)
最終實(shí)現(xiàn)的效果如下圖所示
我用在線工具生成了2個(gè)二維碼,內(nèi)容分別為 “雷猴” 和 “鯊魚辣椒”。
通過(guò)掃描二維碼,把內(nèi)容添加到頁(yè)面中。
實(shí)現(xiàn)思路
查文檔
既然 uni-app 的組件和API 都沒(méi)有提供這方面的幫助,我就去 插件市場(chǎng) 看了下,要么只支持小程序,要么是收費(fèi)的。
收費(fèi)的??????? 算了,大家都是打工人。
現(xiàn)在 uni-app 官方文檔 和 插件市場(chǎng) 兩條路都走不通(主要是我窮),那還有一條路:html5+
node.js 可以理解為前端向服務(wù)端的延展, html5+ 可以理解為前端向 App 的延展。
為了不浪費(fèi)大家時(shí)間,我整理出本文要用到的 API 和 模塊。
打開 html5+ 可以找到 barcode 掃碼模塊,該模塊有個(gè) create 方法 用來(lái)創(chuàng)建掃碼識(shí)別控件。
但 plus.barcode.create() 方法又需要用到 plus.webview ,也就是會(huì)涉及到 webview 模塊 。
webview 模塊 是用來(lái)管理應(yīng)用窗口界面的,也就可以弄一個(gè)半屏的窗口出來(lái)。
整理
相關(guān)方法都找到七七八八了,只需把邏輯整理好就可以編碼了。
- 【步驟1】弄一個(gè)窗口出來(lái)(半屏,或者你自己定個(gè)尺寸和定位吧)
- 【步驟2】弄一個(gè)掃碼控件對(duì)象出來(lái)
- 【步驟3】將掃碼控件添加到窗口
- 【步驟4】掃碼成功后將結(jié)果添加到頁(yè)面上
- 【步驟5】重新調(diào)用掃碼方法
動(dòng)手實(shí)現(xiàn)
我將上面5個(gè)步驟都在代碼注釋里標(biāo)記出來(lái)了。
<template>
<view class="page">
<view class="title">掃碼結(jié)果</view>
<view class="result_list">
<view v-for="item in list" :key="item" class="result_li">
{{ item }}
</view>
</view>
</view>
</template>
<script setup>
import { onReady } from '@dcloudio/uni-app'
import { ref } from 'vue'
let webView = null // webview容器
let barcode = null // 掃碼框
const list = ref([]) // 掃碼結(jié)果 - 列表
// 掃碼成功回調(diào)
function onmarked(type, result) {
// 【步驟4】將掃碼結(jié)果添加到 list 里
list.value.push(result)
// 【步驟5】1秒后再重新開啟掃碼
setTimeout(() => {
barcode.start()
}, 1000)
}
// 創(chuàng)建窗口和掃碼控件
function createBarcode() {
// 【步驟1】判斷有沒(méi)有創(chuàng)建過(guò) webview 容器,如果沒(méi)有就執(zhí)行創(chuàng)建操作
if (!webView) {
webView = plus.webview.open(
'',
'barCodeBox',
{
top: '60px',
width: '100%',
height: '200px'
}
)
}
// 【步驟2】判斷有沒(méi)有創(chuàng)建過(guò) 掃碼框,如果沒(méi)有就執(zhí)行創(chuàng)建操作
if(!barcode){
barcode = plus.barcode.create(
'barcode',
[plus.barcode.QR], // 只掃二維碼
{
top:'0px',
left:'0px',
width: '100%',
height: '200px',
position: 'static',
scanbarColor: '#f1c01f',
frameColor: '#c0ff01'
}
)
barcode.onmarked = onmarked // 掃碼結(jié)果回調(diào)函數(shù)
// 【步驟3】將掃碼框添加到 webview 里
plus.webview.getWebviewById('barCodeBox').append(barcode)
}
barcode.start() // 開始掃碼
}
// 在頁(yè)面加載時(shí),延遲300毫秒執(zhí)行創(chuàng)建掃碼框函數(shù)
onReady(() => {
setTimeout(() => {
createBarcode()
}, 300)
})
</script>
<style>
.page {
height: 100vh;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding: 200px 20rpx 0;
}
.title {
font-size: 50rpx;
color: #333;
}
.result_list {
flex: 1;
overflow-y: auto;
box-sizing: border-box;
padding-top: 20rpx;
}
.result_li {
box-sizing: border-box;
margin-bottom: 20rpx;
padding: 10rpx 20rpx;
border: 1px solid #7298c8;
border-radius: 10rpx;
font-size: 40rpx;
}
</style>
樣式我沒(méi)寫得很精細(xì),只是做了個(gè)粗糙的布局。
相關(guān)文檔
前端佬使用 uni-app 開發(fā) App端 ,建議粗略過(guò)一遍 HTML5+ 文檔,然后抽幾個(gè)自己感興趣的功能做個(gè)demo出來(lái)(這樣能省錢,插件市場(chǎng)的東西也不便宜)。
掃碼相關(guān)
plus.barcode.create 的第二個(gè)參數(shù)是一個(gè)數(shù)組,里面可以設(shè)置需要識(shí)別的條碼類型,可以同時(shí)支持多種條碼。
barcode 支持多種條碼:
- QR: QR二維碼,數(shù)值為0
- EAN13: EAN條形碼標(biāo)準(zhǔn)版,數(shù)值為1
- EAN8: ENA條形碼簡(jiǎn)版,數(shù)值為2
- AZTEC: Aztec二維碼,數(shù)值為3
- DATAMATRIX: Data Matrix二維碼,數(shù)值為4
- UPCA: UPC條形碼標(biāo)準(zhǔn)版,數(shù)值為5
- UPCE: UPC條形碼縮短版,數(shù)值為6
- CODABAR: Codabar條形碼,數(shù)值為7
- CODE39: Code39條形碼,數(shù)值為8
- CODE93: Code93條形碼,數(shù)值為9
- CODE128: Code128條形碼,數(shù)值為10
- ITF: ITF條形碼,數(shù)值為11
- PDF417: PDF 417二維條碼,數(shù)值為13
我們?cè)诒纠兄饕玫?barcode.create 方法創(chuàng)建掃碼控件。
本文只用了 掃碼成功的回調(diào) ,在你的業(yè)務(wù)中可能還需要用到 掃碼失敗的回調(diào) 。
更多的配置和樣式設(shè)置,建議自行查閱官方文檔。本文的案例也有對(duì)掃碼框做了顏色的調(diào)整(隨便選了個(gè)顏色)。



浙公網(wǎng)安備 33010602011771號(hào)