首頁>科技>

在開發的過程中,我封裝了三個大家可能用到的Uni-App元件,他們分別是:支援音訊倍速播放以及自定義UI的音訊播放器yz-audio、支援自動網路重試請求的zackRetrier、支援類似於錘子手機的“大爆炸分詞”的yz-text。

原始碼地址: https://github.com/yangzhongke/uniapp-youzack-components

下面分別來介紹他們的用法以及實現原理:

一、倍速音訊播放器yz-audio

youzack中需要播放聽力音訊,Uni-App有<audio>元件,但是有如下缺點:不被推薦使用了;不支援變速播放功能;介面不能自定義。因此我開發了yz-audio這個元件。

外掛地址:https://ext.dcloud.net.cn/plugin?id=4246

基本使用方式:

<yz-audio ref="player1">

</yz-audio>

在程式碼中播放以及設定名字、海報圖片等:

var player1 = this.$refs.player1; player1.setSrc(

"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3");

player1.setPoster("https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png");//海報圖片

player1.setSinger("貝多芬");//設定歌手

player1.setName("致愛麗絲");//設定作品名字

方法說明:

方法名稱

引數

說明

setSrc

value:string型別,音訊檔案Url

設定要播放的音訊檔案

setPoster

value: string型別,海報圖片Url

setName

value: string型別,作品名

設定作品名

setSinger

value: string型別,歌手名

設定歌手名

stop

停止播放

seek

t:number型別,進度(秒)

跳轉到第t秒播放

play

播放

pause

暫停播放

playbackRate

value:number型別,倍速

設定播放倍速,具體可選值請參考Uni-App文件裡uni.createVideoContext的playbackRate方法。

需要特別注意:playbackRate方法不能在play/setSrc之前或者之後立即呼叫,否則只有很少機率會成功。如果需要在play/setSrc後呼叫,最好延時呼叫playbackRate。

屬性說明:

屬性名

型別

預設值

說明

isButton1Visible

boolean

false

button1Text

string

isButton2Visible

boolean

false

button2Text

string

isButton3Visible

boolean

false

button3Text

string

例子程式碼:

isButton1Visible="true" isButton2Visible="true" isButton3Visible="true" @Button1Click="btn1Click">

</yz-audio>

如果這三個文字無法滿足要求,也可以使用名字為extraCtrls的插槽來自定義這塊的UI,如下:

<yz-audio ref="player1">

<template v-slot:extraCtrls>

<uni-icons type="camera"></uni-icons>

<text>youzack.com</text>

</template>

</yz-audio>

事件說明:

名稱

引數

說明

Button1Click

Button2Click

Button3Click

play

開始播放

pause

暫停

ended

結束播放

timeUpdate

{currentTime, duration},來自於video控制元件的timeUpdate事件引數的detail屬性值。

播放進度變化時觸發

error

錯誤物件

影片播放出錯時觸發

注意事項:

1、 只有video元件支援倍速播放,所以這個元件是採用的video來播放音訊,因此支援的音訊檔案格式取決於video元件的支援情況;

2、 由於VideoContext的內部實現的未知原因,不能在play方法之前或者之後立即呼叫playbackRate來修改倍速,否則很可能不會生效。最好由使用者觸發的動作來呼叫playbackRate,如果必須在play方法前後呼叫,建議透過setTimeout設定一個延時來執行playbackRate。

比如如下是不行的:

var player1 = this.$refs.player1;

player1.setSrc("https://www.test.com/test.mp3");

player1.playbackRate(0.5);

可以如下修改:

var player1 = this.$refs.player1;

player1.setSrc("https://www.test.com/test.mp3");

setTimeout(function(){player1.playbackRate(0.5);},500);

3、 由於元件是使用video來播放音訊,因此具有video的所有缺點,比如不能實現後臺播放。我曾經想換用getBackgroundAudioManager()來替換video,但是發現BackgroundAudioManager響應速度很慢,無法實現精細、及時的進度控制。

4、 如果需要音訊的鎖屏播放,可以在需要後臺播放的時候(需要使用者操作觸發),暫停yz-audio的播放,然後再呼叫getBackgroundAudioManager實現後臺播放。

5、 如果仔細觀察播放器,你可能會發現右上角有一個小黑點,那個其實就是一個尺寸非常小的video元件。但是這個video元件不能完全隱藏,否則在ios下將會無法播放。

6、 由於播放器屬於個性化需求非常強的元件,眾口難調,因此這個元件很難完全滿足所有人的要求,因此這個元件我只是開放原始碼,各位可以根據自己的需要修改,我將不會進行後續維護、新需求增加等。

二、網路請求重試zackRetrier

在網路訊號不強等情況下,網路請求可能會失敗,因此我開發了一個能自動對失敗的請求進行重試的元件zackRetrier,如果N次重試都失敗了,還會彈出對話方塊問使用者“是否再次重試”。在請求處理期間會自動顯示loading提示。

外掛地址:https://ext.dcloud.net.cn/plugin?id=4247

用法:

首先引入元件import {zRetrier} from "@/js_sdk/yz-zackRetrier/zackRetrier/index.js";

呼叫傳送網路請求:zRetrier({url:"https://api.youzack.com/test"}),zRetrier函式返回的是Promise物件,所以既可以用await的方式獲取呼叫結果,也可以使用then()方式。返回值是一個長度為2的陣列,陣列的第一個元素是錯誤物件,如果呼叫成功了,則第一個元素是null,陣列的第二個元素是伺服器端返回的響應。

示例程式碼1

zRetrier({url:"https://api.youzack.com/test",manualRetryContent:"登入失敗,是否重試"})

.then(res=>{

let err = res[0];

let resp = res[1];

if(err)

{

uni.showModal({

content:"呼叫失敗"+err.errMsg

});

return;

}

uni.showModal({

content:"呼叫成功"+resp

});

});

示例程式碼2:

let err1,resp1;

[err1,resp1] = await zRetrier({url:"https://api.youzack.com/test",manualRetryContent:"登入失敗,是否重試"});

if(err1)

{

uni.showModal({

content:"呼叫失敗"+err1.errMsg

});

return;

}

uni.showModal({

content:"呼叫成功"+resp1

});

zRetrier函式只有一個引數,這個引數會完整的傳遞給內部封裝的uni.request方法,所以如果想設定method、headers等,用法和uni.request一樣。除此之外,zRetrier的引數還有其他屬性。

引數:

1) retryTimes:整數型別。代表一次失敗之後,最多自動重試retryTimes次,預設值是3。

2) retryWaitTime:整數型別,代表每次自動重試之前等待的毫秒數。預設值是200。

3) autoLoading:boolean型別,代表請求期間是否自動顯示loading,預設值是true。

4) manualRetryContent:string型別。如果設定了manualRetryContent的值,則在retryTimes次自動重試都失敗後,會顯示重試對話方塊,然後對話方塊中顯示manualRetryContent的內容。對話方塊中有【取消】、【重試】兩個按鈕,如果使用者點選了【重試】按鈕之後,會再自動最大重試retryTimes次。

感謝C#中發明了await、async關鍵字極大的簡化了非同步程式設計,並且讓JavaScript從C#中把這兩個關鍵字借鑑了過來,最終能讓我實現這個元件起來太簡單了。

注意事項:由於這個元件可能多次重試後端介面,所有後端的介面需要是冪等的,也就是呼叫一次和呼叫N次的效果應該是一樣的。

三、允許自定義選擇選單的“分詞大爆炸”yz-text

為了方便使用者直接查詢例句中某個單詞或者片語的中文翻譯,youzack小程式中需要允許使用者對於介面中的英文選中進行查詢。微信小程式中,可以對於<text>設定user-select=”true”來允許使用者自由選擇其中的文字,在Android手機中,選中文字會彈出一個只帶【複製】一個選單項的選單,在蘋果手機中,選中文字會彈出一個帶【查詢】等選單項的選單。但是這個選單中是無法自定義選單項的。

我想監聽剪下板中內容的變化,來實現“使用者複製單詞後自動查詢單詞”的功能。但是微信小程式中沒有提供監聽剪下板內容變化的API,所以只能用定時器監聽剪下板中的內容。釋出後,有使用者反映,在小米的某些手機上,手機系統會頻繁的提示“應用正在讀取剪下板中的內容”,非常影響使用。這個可以理解,為了保護使用者隱私,避免很多應用透過監聽剪下板來偷窺使用者的內容,因此新版的IOS和Android中都會做出類似的提示。

外掛地址:https://ext.dcloud.net.cn/plugin?id=4249

元件用法:

<yz-text text="I love you, I've get set !"></yz-text>

屬性說明:

屬性名

型別

預設值

說明

text

string

顯示的文字

tips

string

button1Text

string

'翻譯'

事件說明:

名稱

引數

說明

split

{value,’’,words:[]}

如果不監聽split事件或者split事件中設定e.words不是空,則按照英文進行分詞。

split事件中對文字進行自定義分詞,e.value是文字,e.words是分析後的字串陣列。

search

字串

示例程式碼:

<yz-text text="I love you, I've get set !"></yz-text>

tips="選中文字進行搜尋" button1Text="搜尋"></yz-text>

split:function(e)

{

e.words=e.value.split("");

},

search:function(s)

{

uni.showToast({

title:s

});

},

示例中的中文分詞用的是簡單的一元分詞,你可以用更智慧的其他分詞演算法。

5
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • “果粉”有福了,蘋果新系統再度升級,安卓體驗再次被拉開差距
  • @ Copyright 2019 劇多 All Rights Reserved.