在uni-app中,使用video時,要在視頻上覆蓋內容,而且要兼容app端,安卓端的適配還好作點,可是ios的話,就弄了我很久,搞了大半天才搞定,這裏記錄下
1.微信小程序端
- 視頻作的是全屏顯示的視頻,使用cover-view和cover-image對視頻進行覆蓋,不過,cover-view也有不少限制,像文字多行省略,這個沒找到方式,單行的省略就直接用普通就能夠了
使用cover-view作三角形也是行不通的,可是你在開發者工具上是沒有問題,可以正常顯示的,因此,在cover-iew中,要想作三角形的效果,只能用圖片來代替
2.APP端
- 使用原生子窗體對video進行覆蓋,在視頻的那個vue文件中,新創建nvue文件,能夠創建多個原生子窗體
- 在page.json中
{
"path": "pages/videolist/videolist",
"style": {
"navigationBarTitleText": "視頻列表",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"app-plus": {
"bounce": "none",
"pullToRefresh": {
"support": false
},
"subNVues": [{
"id": "videoChild",
"path": "pages/videolist/index",
"style": {
"position": "absolute",
"left": "0px",
"top": "100px",
"width": "750px",
"height": "110px",
"background": "transparent"
}
}]
}
}
}
- index.nvue文件中,要使用text標籤來顯示文字,在nvue中使用375px爲屏幕寬度,默認的佈局爲flex佈局,且是縱向的;背景色要使用background-color進行設置
- 在nvue中可使用scroll-view來進行滾動
- 對文字超出隱藏,使用lines進行行數的設置
overflow: hidden;
width: 200px;
text-overflow: ellipsis;
lines: 1;
- index.nvue文件,要設置page.json中的id
<div class="shopInfo" id="videoChild">
<div class="shopIntroduce">
<image class="shopLogo" :src="shopLogo"></image>
<text class="subShopInfo">{{videoTitle}}</text>
</div>
/* 在vue文件中定義事件 */
this.$nextTick(() => {
let list = {};
uni.$emit('children', temporaryObj);
});
/* 在nvue中對事件進行監聽,並在組件銷燬前移除事件監聽 */
created() {
uni.$on('children', (data) => {
this.$nextTick(() => {
this.codeImg = data.code_img;
})
})
},
beforeDestroy(){
uni.$off('children');
this.goodsId = '';
},
安卓和ios對於原生子窗體的彈出表現形式不一樣
const subNVue = uni.getSubNVueById('videoChild');
/* 隱藏窗體 */
subNVue.hide('none',200);
/* 顯示窗體 */
subNVue.show('slide-in-bottom', 200);
- 在安卓端的page.json中能夠不定義"type": "popup",定義也不會出現問題,可是ios端必須定義這個值,才能使窗體在彈出時不會佈局錯亂;在ios端,若是你沒有定義這個屬性,而後你設置的子窗體是從底部彈出,且不須要滿屏的時候,就會出現這個窗體滿屏顯示,佈局也出現問題
"id": "videoChild",
"path": "pages/videolist/index",
"type": "popup",
"style": {
"position": "absolute",
"left": "0px",
"bottom": "0px",
"width": "375px",
"height": "340px",
"background": "transparent"
}
- 還有很奇怪的,就是在安卓端的原生子窗體中,使用本地圖片是能夠顯示的,可是,在ios端,使用本地圖片就只有在編譯調試的那一次纔可以顯示出來;這個bug測試了我很久,我還一直在搞原生子窗體的佈局,對他的position進行更改,後面突然想到,可能使用網絡圖片就能顯示了,結果,哇,還真的是...
APP端的showLoading和小程序端的顯示也是不同
uni.showLoading({
title: `視頻下載中...`,
})
const downloadTask = uni.downloadFile({})
downloadTask.onProgressUpdate((res) => {
uni.showLoading({
title: `視頻下載${res.progress}%`,
})
if(res.progress == 100) {
uni.hideLoading();
}
});
- 在小程序端,這樣寫就可以很完美的顯示出下載進度,可是app端,若是要顯示下載進度的話,就會形成視頻和頁面卡頓,而且,loading狀態也是一直抖動的狀態,沒有解決方案,各位大佬有的話,能夠在評論區告知下,謝謝
視頻下載
- 安卓端和ios端有着不一樣的狀態,安卓端不須要進行savefile操做
- 可是ios端須要先進行savefile,而後,再保存到相冊中
- 安卓端使用了插件進行權限的判斷權限插件
const downloadTask = uni.downloadFile({
url: '',
success: async (res) => {
let filePath = res.tempFilePath;
let albumAuth;
/* 判斷是不是安卓 */
if(uni.getSystemInfoSync().platform == 'android') {
albumAuth = await this.requestAndroidPermission();
/* 若是沒有相冊權限,則跳轉到應用管理界面 */
if(albumAuth != 1) {
permision.gotoAppPermissionSetting()
} else {
uni.saveVideoToPhotosAlbum({
filePath,
success: file => {
uni.showToast({
title: '下載成功',
icon: 'none',
duration: 1500
})
},
fail: err => {
permision.gotoAppPermissionSetting()
},
})
}
} else {
/* ios端在下載後先進行savefile,而後在保存到相冊中 */
uni.saveFile({
tempFilePath: filePath,
success: function (res) {
var savedFilePath = res.savedFilePath;
uni.saveVideoToPhotosAlbum({
filePath: savedFilePath,
success: file => {
uni.showToast({
title: '下載成功',
icon: 'none',
duration: 1500
})
},
fail: err => {
permision.gotoAppPermissionSetting()
},
})
}
});
}
},
})
/* 獲取安卓端的相冊權限 */
async requestAndroidPermission() {
var result = await permision.requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE');
return result ? 1 : 0;
},
- APP端的nvue佈局仍是有點不太好弄,在樣式上直接盲寫的話,不能達到想要的效果,仍是要直接進行真機調試,而後的話,就是,我在安卓端保存視頻的話,彷佛是在安裝應用的時候就會受權相冊,ios在進行savefile操做時,會彈框提醒
正在努力學習中,若對你的學習有幫助,留下你的印記唄(點個贊咯^_^)