微信小程序-自定義語音輸入

最近有寫一個(gè)自定義的語音輸入界面,大概流程與正常微信發(fā)語音的流程相仿.效果截圖如下:


實(shí)現(xiàn)效果截圖

下面貼代碼了:(代碼很長(zhǎng),可直接復(fù)制運(yùn)行,效果會(huì)比較直觀)

wxml:

<view class='voice-mask' wx:if="{{showVoiceMask}}" bindtap='hideVoiceMask'></view>

<view class='voice-enter-note' wx:if = "{{showVoiceMask && !startRecording}}"></view>

<image class='voice-enter-note-image' src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceStart.png' wx:if = "{{showVoiceMask && !startRecording}}"></image>

<image src='/pages/interaction/tempImage/appstore_ic_interaction_addMedia_voiceMask_voiceButton.png' class='voice-button' wx:if="{{showVoiceMask}}" bindtouchstart="startRecording" bindtouchend="stopRecording" bindtouchmove="moveToCancle"></image>

<view class='voice-note' wx:if="{{showVoiceMask && startRecording}}">

</view>

<view class='record-voice-animations' wx:if="{{showVoiceMask && startRecording && !cancleRecording}}">

? ? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_1.png' wx:if="{{recordAnimationNum===1}}"></image>

? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_2.png' wx:if="{{recordAnimationNum===2}}"></image>

? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_3.png' wx:if="{{recordAnimationNum===3}}"></image>

? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_4.png' wx:if="{{recordAnimationNum===4}}"></image>

? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_5.png' wx:if="{{recordAnimationNum===0}}"></image>

? </view>

<view class='cancle-record-voice' wx:if="{{showVoiceMask && startRecording && cancleRecording}}">

? ? <image src='/pages/interaction/tempImage/voiceAnimation/appstore_ic_interaction_addMedia_voiceAnimation_cancleVoice.png'></image>

wxss:

.voice-mask {

? position: fixed;

? top: 0rpx;

? left: 0rpx;

? width: 750rpx;

? height: 1230rpx;

? background-color: #000000;

? opacity: 0.6;

? display: flex;

? flex-direction: column;

? align-items: center;

? z-index: 10;

}

.voice-enter-note {

? position: absolute;

? width: 320rpx;

? height: 320rpx;

? left: 215rpx;

? top: 380rpx;

? z-index: 30;

? background-color: #000000;

? opacity: 0.5;

? border-radius: 15rpx;

}

.voice-enter-note-image {

? position: absolute;

? width: 292rpx;

? height: 207rpx;

? left: 229rpx;

? top: 436.5rpx;

? z-index: 40;

}

.voice-button {

? position: absolute;

? width: 160rpx;

? height: 160rpx;

? bottom: 90rpx;

? left: 295rpx;

? z-index: 20;

}

.voice-note {

? position: absolute;

? width: 320rpx;

? height: 320rpx;

? left: 215rpx;

? top: 380rpx;

? z-index: 30;

? background-color: #000000;

? opacity: 0.5;

? border-radius: 15rpx;

}

.record-voice-animations {

? position: absolute;

? width: 292rpx;

? height: 207rpx;

? left: 229rpx;

? top: 436.5rpx;

? z-index: 40;

}

.record-voice-animations image {

? width: 292rpx;

? height: 207rpx;

}

.cancle-record-voice {

? position: absolute;

? width: 292rpx;

? height: 207rpx;

? left: 229rpx;

? top: 436.5rpx;

? z-index: 40;

}

.cancle-record-voice image {

? width: 292rpx;

? height: 207rpx;

}

js:

// 開始錄音

? startRecording:function (e) {

? ? console.log('開始錄音');

? ? this.setData({

? ? ? selectType: 'voice',

? ? ? startRecording:true

? ? })

? ? this.startVoiceRecordAnimation();

? ? var that = this;

? ? const recorderManager = wx.getRecorderManager();

? ? recorderManager.start({

? ? ? format: 'mp3',

? ? });

? ? recorderManager.onStart(() => {

? ? ? console.log('recorder start')

? ? })

? },

? // 結(jié)束錄音

? stopRecording: function (e) {

? ? console.log('結(jié)束錄音');

? ? var that = this;

? ? const recorderManager = wx.getRecorderManager();

? ? recorderManager.stop();

? ? recorderManager.onStop((res) => {

? ? ? console.log('recorder stop', res)

? ? ? const { tempFilePath } = res;

? ? ? if (res.duration < 1000) {

? ? ? ? wx.showToast({

? ? ? ? ? title: '說話時(shí)間太短!',

? ? ? ? ? icon:'none'

? ? ? ? })

? ? ? ? this.stopVoiceRecordAnimation();

? ? ? ? that.setData({

? ? ? ? ? startRecording: false

? ? ? ? })

? ? ? ? return;

? ? ? }

? ? ? if (this.data.cancleRecording === false) {

? ? ? ? if (tempFilePath.length !== 0) {

? ? ? ? ? var recordLength = 0;

? ? ? ? ? if (res.duration / 1000 < 22) {

? ? ? ? ? ? recordLength = 160;

? ? ? ? ? } else {

? ? ? ? ? ? recordLength = (res.duration / 1000) / 60 * 440;

? ? ? ? ? }

? ? ? ? ? var recordTime = (res.duration / 1000).toFixed(0);

? ? ? ? ? console.log('recordLength' + recordLength);

? ? ? ? ? that.setData({

? ? ? ? ? ? recordingLength: recordLength,

? ? ? ? ? ? recordingTime: recordTime,

? ? ? ? ? ? voiceTempFilePath: tempFilePath,

? ? ? ? ? ? selectResource: true,

? ? ? ? ? ? showVoiceMask: false,

? ? ? ? ? ? startRecording: false

? ? ? ? ? })

? ? ? ? ? that.stopVoiceRecordAnimation();

? ? ? ? }

? ? ? } else {

? ? ? ? that.setData({

? ? ? ? ? selectResource: false,

? ? ? ? ? showVoiceMask: false,

? ? ? ? ? startRecording: false,

? ? ? ? ? cancleRecording:false

? ? ? ? })

? ? ? ? that.stopVoiceRecordAnimation();

? ? ? }

? ? })

? },

? //向上滑動(dòng)取消錄音

? moveToCancle: function (event) {

? ? let currentY = event.touches[0].pageY;

? ? if (this.data.lastVoiceYPostion !== 0) {

? ? ? if (currentY - this.data.lastVoiceYPostion < 0 && currentY < 470) {

? ? ? ? this.setData({

? ? ? ? ? cancleRecording:true

? ? ? ? })

? ? ? }

? ? }

? ? this.setData({

? ? ? lastVoiceYPostion: currentY

? ? })

? },

? //麥克風(fēng)幀動(dòng)畫?

? startVoiceRecordAnimation:function () {

? ? var that = this;

? ? //話筒幀動(dòng)畫?

? ? var i = 1;

? ? that.data.recordAnimationSetInter = setInterval(function () {

? ? ? i++;

? ? ? i = i % 5;

? ? ? that.setData({

? ? ? ? recordAnimationNum: i

? ? ? })

? ? }, 300);

? },

? // 停止麥克風(fēng)動(dòng)畫計(jì)時(shí)器

? stopVoiceRecordAnimation:function () {

? ? var that = this;

? ? clearInterval(that.data.recordAnimationSetInter);

? },

以上就是關(guān)于這個(gè)界面的實(shí)現(xiàn)代碼啦,寫的不好還請(qǐng)多多指教.

還有關(guān)于錄音之后播放音頻的相關(guān)問題,請(qǐng)查看我的上一篇帖子:微信小程序-InnerAudioContext()播放音頻

謝謝大家~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萍嬉,一起剝皮案震驚了整個(gè)濱河市蛙吏,隨后出現(xiàn)的幾起案子婆咸,更是在濱河造成了極大的恐慌芋忿,老刑警劉巖颅崩,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅湘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佛析,警方通過查閱死者的電腦和手機(jī)益老,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寸莫,“玉大人捺萌,你說我怎么就攤上這事”炀ィ” “怎么了桃纯?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)披坏。 經(jīng)常有香客問我态坦,道長(zhǎng),這世上最難降的妖魔是什么棒拂? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任伞梯,我火速辦了婚禮,結(jié)果婚禮上帚屉,老公的妹妹穿的比我還像新娘谜诫。我一直安慰自己,他們只是感情好攻旦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布喻旷。 她就那樣靜靜地躺著,像睡著了一般牢屋。 火紅的嫁衣襯著肌膚如雪掰邢。 梳的紋絲不亂的頭發(fā)上牺陶,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音辣之,去河邊找鬼。 笑死皱炉,一個(gè)胖子當(dāng)著我的面吹牛怀估,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播合搅,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼多搀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了灾部?” 一聲冷哼從身側(cè)響起康铭,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赌髓,沒想到半個(gè)月后从藤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锁蠕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年夷野,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣倾。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悯搔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舌仍,到底是詐尸還是另有隱情妒貌,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布铸豁,位于F島的核電站灌曙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏推姻。R本人自食惡果不足惜平匈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏古。 院中可真熱鬧增炭,春花似錦、人聲如沸拧晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厂捞。三九已至输玷,卻和暖如春队丝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欲鹏。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工机久, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赔嚎。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓膘盖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親尤误。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侠畔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,309評(píng)論 0 10
  • 微信小程序自定義組件的使用软棺,來自項(xiàng)目的總結(jié) 一直以來忙項(xiàng)目都沒有什么時(shí)間來寫博客,今天晚上刷了會(huì)兒csdn,知乎等...
    27億光年中的小小塵埃閱讀 4,703評(píng)論 2 11
  • 目錄 “這……”紫金鼠一時(shí)語塞尤勋。 “哈哈喘落,逗你呢,事既然已經(jīng)過去便不提了斥黑,你走吧揖盘!” 紫金鼠聽見了貓九的笑聲,卻不...
    雨涼城閱讀 377評(píng)論 24 6
  • 無論昨天發(fā)生什么 經(jīng)歷了什么 只要今天我還能呼吸 我便要微笑 便要活在希望里 活在未來會(huì)美好的信念里 說我傻也沒關(guān)...
    雪莉詩話閱讀 229評(píng)論 13 30
  • 1/8秒延時(shí)的概念 網(wǎng)絡(luò)交流和面對(duì)面的延時(shí)锌奴,在真正的交流中是不能接受的兽狭,還不算誤會(huì)
    布衣華箏閱讀 241評(píng)論 0 0