Ionic 4:Cordova Camera Preview 隐藏了 html 个元素,即使 "toBack" 设置为 "true"
Ionic 4: Cordova Camera Preview is hiding html-elements, even though "toBack" is set to "true"
对于一个大学项目,我必须使用 Ionic 4 实现一个 Ionic 应用程序。
该应用程序使用地理定位在地图中显示街头艺术的位置。
在另一个菜单选项卡中,您可以扫描 QR 码,它提供有关来自 .json 的特定街头艺术的数据,并使用 cordova 插件将其显示在相机预览中。
扫描工作正常,之后相机预览打开,但我看不到 .html 中的对象,即使 "toBack" 设置为 "true"。
我真的被这个问题困住了,找不到任何解决方案。
import { Component, OnInit, Inject, ViewEncapsulation } from '@angular/core';
import { BarcodeScanner } from '@ionic-native/barcode-scanner/ngx';
import { JsonDataService } from '../../json-data.service';
import { DOCUMENT } from '@angular/common';
import { Toast } from '@ionic-native/toast/ngx';
import { Router } from '@angular/router';
import { NavController } from '@ionic/angular';
import { CameraPreview, CameraPreviewOptions } from '@ionic-native/camera-preview/ngx';
import { Platform } from '@ionic/angular';
@Component({
selector: 'app-ar',
templateUrl: './ar.page.html',
styleUrls: ['./ar.page.scss'],
})
export class ArPage implements OnInit {
datenData = [];
selectedProduct: any;
productFound = false;
constructor(
private barcodeScanner: BarcodeScanner,
private datenService: JsonDataService,
private toast: Toast,
private router: Router,
public navCtrl: NavController, private cameraPreview: CameraPreview, private platform: Platform,
@Inject(DOCUMENT) private _document) {
fetch('../../../assets/data/data.json').then(res => res.json())
.then(data => {
this.datenData = data.jsondata;
this.datenService.setJsondata(this.datenData);
console.log(data);
});
}
ngOnInit() {
this.qrscan();
}
qrscan() {
this.datenData = this.datenService.getJsondata();
this.selectedProduct = {};
this.barcodeScanner.scan().then((barcodeData) => {
this.selectedProduct = this.datenData.find(daten => daten.qrcode === barcodeData.text);
if (this.selectedProduct !== undefined) {
this.productFound = true;
this.camerapreview();
} else {
this.productFound = false;
this.router.navigate(['/tabs/tab2']);
this.toast.show(`Product not found`, '5000', 'center').subscribe(
toast => {
console.log(toast);
}
);
}
}, (err) => {
this.toast.show(err, '5000', 'center').subscribe(
toast => {
console.log(toast);
this.router.navigate(['/tabs/tab2']);
}
);
});
}
camerapreview() {
const cameraPreviewOpts: CameraPreviewOptions = {
width: window.screen.width,
height: window.screen.height,
previewDrag: true,
toBack: true,
alpha: 1,
x: 0,
y: 0,
camera: 'rear',
}
// start camera
this.cameraPreview.startCamera(cameraPreviewOpts);
}
}
html, body, .ion-app, .ion-content, .nav-decor {
background-color: transparent !important;
}
<ion-header>
<ion-toolbar text-center>
<ion-buttons slot="start" defaultHref="/tabs/tab2">
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>ar</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
</ion-content>
如果有人能帮助我解决这个问题,我将不胜感激。
真的谢谢你!
编辑:
这是它的 github 存储库:https://github.com/alexandrasophiapetersen/ARapp。
在 Pages/ar 中是一个示例 QR 码。
当前页面的屏幕截图(可以看出,html-对象在相机预览后面):
tl;dr: cordova-camera-preview 插件与电容器不兼容,请参阅:capacitor/issues/1732 and cordova-plugin-camera-preview/issues/563
旧答案:您是否确定您的css确实生效并且将所有重要图层设置为透明?
如果您将像 html
这样的选择器放在除主应用程序组件之外的任何地方,它们将无法开箱即用,因为 angular 默认启用 ViewEncapsulation。
如果确实是这种情况,您可以通过将 css 移动到主应用程序组件的样式表或禁用相关页面的 ViewEncapsulation 来解决它:
@Component({
selector: 'app-ar',
templateUrl: './ar.page.html',
styleUrls: ['./ar.page.scss'],
encapsulation: ViewEncapsulation.None
})
更新:尝试添加
app-ar ion-content {
--background: transparent;
}
ion-content
否则会隐藏实时预览:
对于一个大学项目,我必须使用 Ionic 4 实现一个 Ionic 应用程序。
该应用程序使用地理定位在地图中显示街头艺术的位置。
在另一个菜单选项卡中,您可以扫描 QR 码,它提供有关来自 .json 的特定街头艺术的数据,并使用 cordova 插件将其显示在相机预览中。
扫描工作正常,之后相机预览打开,但我看不到 .html 中的对象,即使 "toBack" 设置为 "true"。
我真的被这个问题困住了,找不到任何解决方案。
import { Component, OnInit, Inject, ViewEncapsulation } from '@angular/core';
import { BarcodeScanner } from '@ionic-native/barcode-scanner/ngx';
import { JsonDataService } from '../../json-data.service';
import { DOCUMENT } from '@angular/common';
import { Toast } from '@ionic-native/toast/ngx';
import { Router } from '@angular/router';
import { NavController } from '@ionic/angular';
import { CameraPreview, CameraPreviewOptions } from '@ionic-native/camera-preview/ngx';
import { Platform } from '@ionic/angular';
@Component({
selector: 'app-ar',
templateUrl: './ar.page.html',
styleUrls: ['./ar.page.scss'],
})
export class ArPage implements OnInit {
datenData = [];
selectedProduct: any;
productFound = false;
constructor(
private barcodeScanner: BarcodeScanner,
private datenService: JsonDataService,
private toast: Toast,
private router: Router,
public navCtrl: NavController, private cameraPreview: CameraPreview, private platform: Platform,
@Inject(DOCUMENT) private _document) {
fetch('../../../assets/data/data.json').then(res => res.json())
.then(data => {
this.datenData = data.jsondata;
this.datenService.setJsondata(this.datenData);
console.log(data);
});
}
ngOnInit() {
this.qrscan();
}
qrscan() {
this.datenData = this.datenService.getJsondata();
this.selectedProduct = {};
this.barcodeScanner.scan().then((barcodeData) => {
this.selectedProduct = this.datenData.find(daten => daten.qrcode === barcodeData.text);
if (this.selectedProduct !== undefined) {
this.productFound = true;
this.camerapreview();
} else {
this.productFound = false;
this.router.navigate(['/tabs/tab2']);
this.toast.show(`Product not found`, '5000', 'center').subscribe(
toast => {
console.log(toast);
}
);
}
}, (err) => {
this.toast.show(err, '5000', 'center').subscribe(
toast => {
console.log(toast);
this.router.navigate(['/tabs/tab2']);
}
);
});
}
camerapreview() {
const cameraPreviewOpts: CameraPreviewOptions = {
width: window.screen.width,
height: window.screen.height,
previewDrag: true,
toBack: true,
alpha: 1,
x: 0,
y: 0,
camera: 'rear',
}
// start camera
this.cameraPreview.startCamera(cameraPreviewOpts);
}
}
html, body, .ion-app, .ion-content, .nav-decor {
background-color: transparent !important;
}
<ion-header>
<ion-toolbar text-center>
<ion-buttons slot="start" defaultHref="/tabs/tab2">
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>ar</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
</ion-content>
如果有人能帮助我解决这个问题,我将不胜感激。
真的谢谢你!
编辑:
这是它的 github 存储库:https://github.com/alexandrasophiapetersen/ARapp。
在 Pages/ar 中是一个示例 QR 码。
当前页面的屏幕截图(可以看出,html-对象在相机预览后面):
tl;dr: cordova-camera-preview 插件与电容器不兼容,请参阅:capacitor/issues/1732 and cordova-plugin-camera-preview/issues/563
旧答案:您是否确定您的css确实生效并且将所有重要图层设置为透明?
如果您将像 html
这样的选择器放在除主应用程序组件之外的任何地方,它们将无法开箱即用,因为 angular 默认启用 ViewEncapsulation。
如果确实是这种情况,您可以通过将 css 移动到主应用程序组件的样式表或禁用相关页面的 ViewEncapsulation 来解决它:
@Component({
selector: 'app-ar',
templateUrl: './ar.page.html',
styleUrls: ['./ar.page.scss'],
encapsulation: ViewEncapsulation.None
})
更新:尝试添加
app-ar ion-content {
--background: transparent;
}
ion-content
否则会隐藏实时预览: