<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於最近用uniapp呼叫原生相機容易出現閃退問題,找了很多教學又是壓縮圖片又是優化程式碼,我表示並沒有太大作用!!
於是開啟了我的解決之路
實現自定義相機
拓展性挺強的,可以實現自定義水印、身份證拍攝、人像拍攝等 這裡我簡單實現一個相機功能主要用於解決閃退
Tip:這裡需要建立nvue檔案哦~
建立camera.nvue
<template> <view class="pengke-camera" :style="{ width: windowWidth, height: windowHeight }"> <live-pusher id="livePusher" ref="livePusher" class="livePusher" mode="FHD" beauty="0" whiteness="0" :aspect="aspect" min-bitrate="1000" audio-quality="16KHz" device-position="back" :auto-focus="true" :muted="true" :enable-camera="true" :enable-mic="false" :zoom="false" @statechange="statechange" :style="{ width: windowWidth, height: windowHeight }" ></live-pusher> <view class="menu"> <!--底部選單區域背景--> <cover-image class="menu-mask" src="/static/live-camera/bar.png"></cover-image> <!--返回鍵--> <cover-image class="menu-back" @tap="back" src="/static/live-camera/back.png"></cover-image> <!--快門鍵--> <cover-image class="menu-snapshot" @tap="snapshot" src="/static/live-camera/shutter.png"></cover-image> <!--反轉鍵--> <cover-image class="menu-flip" @tap="flip" src="/static/live-camera/flip.png"></cover-image> </view> </view> </template> <script> let _this = null; export default { data() { return { poenCarmeInterval:null,//開啟相機的輪詢 aspect: '2:3', //比例 windowWidth: '', //螢幕可用寬度 windowHeight: '', //螢幕可用高度 camerastate: false, //相機準備好了 livePusher: null, //流視訊物件 snapshotsrc: null, //快照 }; }, onLoad(e) { _this = this; this.initCamera(); }, onReady() { this.livePusher = uni.createLivePusherContext('livePusher', this); this.startPreview(); //開啟預覽並設定攝像頭 this.poenCarme(); }, methods: { //輪詢開啟 poenCarme(){ //#ifdef APP-PLUS if (plus.os.name == 'Android') { this.poenCarmeInterval = setInterval(function() { console.log(_this.camerastate); if (!_this.camerastate) _this.startPreview(); }, 2500); } //#endif }, //初始化相機 initCamera() { uni.getSystemInfo({ success: function(res) { _this.windowWidth = res.windowWidth; _this.windowHeight = res.windowHeight; let zcs = _this.aliquot(_this.windowWidth,_this.windowHeight); _this.aspect = (_this.windowWidth/zcs)+':'+(_this.windowHeight/zcs); // console.log('畫面比例:'+_this.aspect); } }); }, //整除數計算 aliquot(x, y) { if (x % y == 0) return y; return this.aliquot(y, x % y); }, //開始預覽 startPreview() { this.livePusher.startPreview({ success: a => { console.log(a) } }); }, //停止預覽 stopPreview() { this.livePusher.stopPreview({ success: a => { _this.camerastate = false; } }); }, //狀態 statechange(e) { //狀態改變 console.log(e); if (e.detail.code == 1007) { _this.camerastate = true; } else if (e.detail.code == -1301) { _this.camerastate = false; } }, //返回 back() { uni.navigateBack(); }, //抓拍 snapshot() { //震動 uni.vibrateShort({ success: function () { console.log('success'); } }); //拍照 this.livePusher.snapshot({ success: e => { _this.snapshotsrc = e.message.tempImagePath; _this.stopPreview(); _this.setImage(); uni.navigateBack(); } }); }, //反轉 flip() { this.livePusher.switchCamera(); }, //設定 setImage() { let pages = getCurrentPages(); let prevPage = pages[pages.length - 2]; prevPage.$vm.setImage({ path: _this.snapshotsrc}); } } }; </script> <style lang="less"> .pengke-camera { justify-content: center; align-items: center; .menu { position: absolute; left: 0; bottom: 0; width: 750rpx; height: 180rpx; z-index: 98; align-items: center; justify-content: center; .menu-mask { position: absolute; left: 0; bottom: 0; width: 750rpx; height: 180rpx; z-index: 98; } .menu-back { position: absolute; left: 30rpx; bottom: 50rpx; width: 80rpx; height: 80rpx; z-index: 99; align-items: center; justify-content: center; } .menu-snapshot { width: 130rpx; height: 130rpx; z-index: 99; } .menu-flip { position: absolute; right: 30rpx; bottom: 50rpx; width: 80rpx; height: 80rpx; z-index: 99; align-items: center; justify-content: center; } } } </style>
這裡用了一些圖片作為圖示佈局畫面美觀,例如返回圖示,拍攝圖示
在點選拍照的時候跳轉到camera頁面
即可 在需要使用的頁面中編寫setImage
方法,即可拿到返回過來的圖片臨時路徑 再通過uniapp自帶的上傳圖片api進行上傳至伺服器即可 這樣就避免了呼叫原生相機
setImage(e){ //e.path即是圖片臨時路徑 uni.uploadFile({ url: '上傳介面的路徑', filePath: e.path, name: 'imageFile', success: function(res) { //伺服器返回的圖片地址url }, error: function(err) { console.log(err) } }
如果既要實現從相簿選又要手機拍呢?該如何實現 這裡相簿選呼叫的uniapp的api, 手機拍跳轉到自定義相機頁面即可
這裡可以寫一個彈窗,讓它選擇,如果選擇了從相簿選圖片則
uni.chooseImage({ count: size, //預設9 sizeType: ['original', 'compressed'], //可以指定是原圖還是壓縮圖,預設二者都有 sourceType: ['album'], //從相簿選擇 success: function (res) { console.log(res)//拿到臨時路徑再向後端傳送上傳請求.... } });
如果用相機拍則跟上方步驟一致
這裡的話我貼上效果圖,如果需要就在我的部落格資源中獲取吧
這樣我就成功解決了閃退問題~
以上就是uniapp自定義相機實現範例詳解的詳細內容,更多關於uniapp自定義相機的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45