ionic 官方有提供三個(gè)掃描插件,分別為:
-
Barcode Scanner
速度很慢,樣式不怎樣 -
QR Scanner
速度快,樣式隨心所欲,直接在html里修改屬于自己的樣式 -
ZBar
速度快,能掃描條形碼與二維碼,這樣也導(dǎo)致如果二維碼附近有其它類似一維碼的圖案,可能會(huì)影響值的準(zhǔn)確性,還有沒有提供掃描框
綜合以上,所以最后還是決定使用QR Scaner進(jìn)行掃描。
1. 安裝插件
$ ionic cordova plugin add cordova-plugin-qrscanner
$ npm install --save @ionic-native/qr-scanner@4
2. 新建掃描頁面
$ ionic g page scan
成功后

圖片.png
3. 使用
assets/imgs
掃描框圖片做css背景
下載圖片

圖片.png
scan.html
<ion-header >
<ion-navbar >
<ion-title>掃描中……</ion-title>
</ion-navbar>
</ion-header>
<ion-content no-scroll [ngClass]="{'qrscanner':isShow}" >
<div [ngClass]="{'qrscanner-area':isShow}">
</div>
<div [ngClass]="{'through-line':isShow}"></div>
<div class="button-bottom">
<button (click)="toggleLight()" ion-fab class="icon-camera" margin-right>
<ion-icon name="flash"></ion-icon>
</button>
<button (click)="toggleCamera()" ion-fab class="icon-camera">
<ion-icon name="reverse-camera"></ion-icon>
</button>
</div>
</ion-content>
scan.scss
page-scan {
.qrscanner {
background: none;
&-area {
width: 100%;
height: 86%;
background: url(../assets/imgs/scanner.svg) no-repeat center center;
background-size: contain;
}
}
.through-line {
left: 25%;
width: 50%;
height: 2px;
background: red;
position: absolute;
animation: myfirst 2s linear infinite alternate;
}
@keyframes myfirst {
0% {
background: red;
top: 30%;
}
25% {
background: yellow;
top: 35%;
}
50% {
background: blue;
top: 40%;
}
75% {
background: green;
top: 45%;
}
100% {
background: red;
top: 50%;
}
}
.button-bottom {
width: 128px;
position: absolute;
left: 50%;
bottom: 80px;
margin-left: -64px;
.icon-camera {
float: left;
}
}
}
scan.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular';
import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner';
/**
* Generated class for the ScanPage page.
*
* See https://ionicframework.com/docs/components/#navigation for more info on
* Ionic pages and navigation.
*/
@IonicPage()
@Component({
selector: 'page-scan',
templateUrl: 'scan.html',
})
export class ScanPage {
light: boolean;//判斷閃光燈
frontCamera: boolean;//判斷攝像頭
isShow: boolean = false;//控制顯示背景,避免切換頁面卡頓
constructor(
private navCtrl: NavController,
private navParams: NavParams,
private qrScanner: QRScanner,
private viewCtrl: ViewController) {
//默認(rèn)為false
this.light = false;
this.frontCamera = false;
}
ionViewDidLoad() {
this.qrScanner.prepare()
.then((status: QRScannerStatus) => {
if (status.authorized) {
// camera permission was granted
// start scanning
let scanSub = this.qrScanner.scan().subscribe((text: string) => {
alert(text);
this.qrScanner.hide(); // hide camera preview
scanSub.unsubscribe(); // stop scanning
this.navCtrl.pop();
});
// show camera preview
this.qrScanner.show();
// wait for user to scan something, then the observable callback will be called
} else if (status.denied) {
// camera permission was permanently denied
// you must use QRScanner.openSettings() method to guide the user to the settings page
// then they can grant the permission from there
} else {
// permission was denied, but not permanently. You can ask for permission again at a later time.
}
})
.catch((e: any) => console.log('Error is', e));
}
ionViewDidEnter(){
//頁面可見時(shí)才執(zhí)行
this.showCamera();
this.isShow = true;//顯示背景
}
/**
* 閃光燈控制,默認(rèn)關(guān)閉
*/
toggleLight() {
if (this.light) {
this.qrScanner.disableLight();
} else {
this.qrScanner.enableLight();
}
this.light = !this.light;
}
/**
* 前后攝像頭互換
*/
toggleCamera() {
if (this.frontCamera) {
this.qrScanner.useBackCamera();
} else {
this.qrScanner.useFrontCamera();
}
this.frontCamera = !this.frontCamera;
}
showCamera() {
(window.document.querySelector('ion-app') as HTMLElement).classList.add('cameraView');
}
hideCamera() {
(window.document.querySelector('ion-app') as HTMLElement).classList.remove('cameraView');
this.qrScanner.hide();//需要關(guān)閉掃描,否則相機(jī)一直開著
this.qrScanner.destroy();//關(guān)閉
}
ionViewWillLeave() {
this.hideCamera();
}
}
variables.scss
ion-app.cameraView, ion-app.cameraView ion-content, ion-app.cameraView .nav-decor {
background: transparent none !important;
.tabbar.show-tabbar{
opacity: 0;
}
// 隱藏所有頁面
ion-nav, ion-tab, ion-tabs {
opacity: 0 !important;
}
}
最后在所需的頁面跳轉(zhuǎn)scan頁面即可
this.navCtrl.push('ScanPage');
4. 效果

1.gif
5. android版本仍黑屏問題
當(dāng)你以上設(shè)置完后,運(yùn)行在android手機(jī)上背景無法透明,依然顯示黑屏的情況,主要是ionic css的結(jié)構(gòu)被改變過,所以代碼所設(shè)置的樣式無法生效,例如安裝了cordova-plugin-crosswalk-webview無法正確顯示相機(jī)畫面。把它刪除即可
注意:以上測(cè)試版本
cordova-plugin-qrscanner@2.5.0
@ionic-native/qr-scanner@4.5.2
如有問題請(qǐng)簡(jiǎn)書留言或訪問網(wǎng)站交流 深圳網(wǎng)站建設(shè) https://www.qijianwang.net