記(ji)錄--uni-app App端半屏連(lian)續掃碼
這里給大家分享我(wo)在(zai)網上總結出(chu)來的一些知識,希望對大家有所幫助
本文用一個簡單的 demo 講解 App端 半屏連續掃碼 的實現方式,包(bao)括(條形碼、二(er)維碼等(deng)各種各樣的碼)。
我會從實現思路講起,如果你比較急可以直接跳到 動手實現 章節獲取代碼。
開發和運行環境
- 開發工具:
- 前端框架: 我用了 vue3 的模式開發
- 前端延伸能力:
- 運行環境:一加8(安卓手機)
需求收集
看到論壇上有人想在 App端 實現 連續掃碼 功能。
認真看了下圖,還是個 半屏 的掃碼框。


只是看到提(ti)了下需求,并沒搜到多少(shao)解(jie)決方(fang)案。
于是我去 看了下,找到相關的內(nei)容:
但 <camera> 組件不支持 App 端使用(至少在寫(xie)本文(wen)時不支(zhi)持(chi));
uni.scanCode 可(ke)以掃碼(ma),但會跳(tiao)到另(ling)一個界面,并在(zai)全屏的模式(shi)下掃碼(ma),也不(bu)支持連(lian)續掃碼(ma)。
當然,用 uni.scanCode 可以在掃碼(ma)成功后再(zai)重新(xin)執(zhi)行一(yi)次(ci),這樣就能實現連續掃碼(ma)的功能,但界面會跳(tiao)來跳(tiao)去(跳(tiao)到掃碼(ma)界面,成功后又(you)跳(tiao)回app的界面,再(zai)執(zhi)行又(you)跳(tiao)到掃碼(ma)界面......)。
提煉需求
根據上(shang)面的信息,提(ti)煉出3個關鍵詞(ci):
- App端
- 半屏
- 連續掃碼
我采用了 DCLOUD社區 里的(de)需求。粗略的(de)寫了下布局(ju)(我沒(mei)有精細寫樣式)
最終實(shi)現的(de)效果如(ru)下圖所示
我(wo)用在線(xian)工具生成了(le)2個二維碼,內容分別為 “雷(lei)猴(hou)” 和(he) “鯊魚辣椒(jiao)”。
通過掃描二維碼,把內容添加到(dao)頁面(mian)中。
實現思路
查文檔
既然 uni-app 的組件和API 都沒有提(ti)供這方面的幫助(zhu),我就去 看了下(xia),要么(me)只(zhi)支持小程序,要么(me)是(shi)收費(fei)的。
收費的??????? 算了,大家都(dou)是打工人。
現在 uni-app 官(guan)方(fang)文檔 和(he) 插件市場 兩條(tiao)路都(dou)走(zou)不通(tong)(主要是(shi)我窮),那還有一(yi)條(tiao)路:
node.js 可以理解為前端向服務端的延展, html5+ 可以理解為前端向 App 的延展。
為了不浪費大家時間,我整理出本(ben)文要用到的 API 和 模塊。
打開(kai) 可以找到(dao) ,該模(mo)塊有(you)個 用來創建掃(sao)碼識(shi)別控件。
但 plus.barcode.create() 方法又需要用到 plus.webview ,也就是會涉及到 。
是用來管理應用窗口界面的,也就可以弄一(yi)個(ge)半屏的窗口出來。
整理
相(xiang)關(guan)方法都找到七七八八了,只需把(ba)邏輯整(zheng)理好就(jiu)可以(yi)編碼(ma)了。
- 【步驟1】弄一個窗口出來(半屏,或者你自己定個尺寸和定位吧)
- 【步驟2】弄一個掃碼控件對象出來
- 【步驟3】將掃碼控件添加到窗口
- 【步驟4】掃碼成功后將結果添加到頁面上
- 【步驟5】重新調用掃碼方法
動手實現
我將(jiang)上(shang)面(mian)5個步驟都在(zai)代碼注釋(shi)里標(biao)記出來了。
<template>
<view class="page">
<view class="title">掃碼結果</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([]) // 掃碼結果 - 列表
// 掃碼成功回調
function onmarked(type, result) {
// 【步驟4】將掃碼結果添加到 list 里
list.value.push(result)
// 【步驟5】1秒后再重新開啟掃碼
setTimeout(() => {
barcode.start()
}, 1000)
}
// 創建窗口和掃碼控件
function createBarcode() {
// 【步驟1】判斷有沒有創建過 webview 容器,如果沒有就執行創建操作
if (!webView) {
webView = plus.webview.open(
'',
'barCodeBox',
{
top: '60px',
width: '100%',
height: '200px'
}
)
}
// 【步驟2】判斷有沒有創建過 掃碼框,如果沒有就執行創建操作
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 // 掃碼結果回調函數
// 【步驟3】將掃碼框添加到 webview 里
plus.webview.getWebviewById('barCodeBox').append(barcode)
}
barcode.start() // 開始掃碼
}
// 在頁面加載時,延遲300毫秒執行創建掃碼框函數
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>
樣(yang)式我沒(mei)寫得很精細,只是做了個粗糙的(de)布局。
相關文檔
前端佬使用 uni-app 開發 App端 ,建(jian)議粗(cu)略過一(yi)遍 ,然后(hou)抽(chou)幾(ji)個自己感(gan)興趣的功能(neng)做個demo出來(這樣能(neng)省(sheng)錢,插件(jian)市(shi)場的東西也不便宜)。
掃碼相關
plus.barcode.create 的第二個(ge)參數是一個(ge)數組,里面可以設置(zhi)需要識別的條(tiao)碼(ma)類型,可以同時支持多種(zhong)條(tiao)碼(ma)。
barcode 支持多種條碼:
- : QR二維碼,數值為0
- : EAN條形碼標準版,數值為1
- : ENA條形碼簡版,數值為2
- : Aztec二維碼,數值為3
- : Data Matrix二維碼,數值為4
- : UPC條形碼標準版,數值為5
- : UPC條形碼縮短版,數值為6
- : Codabar條形碼,數值為7
- : Code39條形碼,數值為8
- : Code93條形碼,數值為9
- : Code128條形碼,數值為10
- : ITF條形碼,數值為11
- : PDF 417二維條碼,數值為13
我們在(zai)本例中主要用(yong)到(dao) 方法(fa)創(chuang)建掃碼控(kong)件。
本文只(zhi)用(yong)(yong)了(le) ,在你的(de)業務中可能還需要用(yong)(yong)到 。
更多的(de)(de)配置和樣式設置,建(jian)議自行查閱官方(fang)文(wen)檔。本文(wen)的(de)(de)案例也(ye)有對掃碼框做了(le)顏色的(de)(de)調整(zheng)(隨便選了(le)個顏色)。


