UNPKG

miue-ui

Version:

ali miniProgram UI components for vehicle.

888 lines (863 loc) 28.3 kB
/** * author:dansion@163.com * data:2022-07-01 * version:V1.0.0 * 2023-04-25:修订bmg可能长度为-1的情况; */ /* method: - play(idx) - setListData(list) Event: - onPress(e) - onPlaying(e) - onEnded */ import INFO from '../../modules/systeminfo'; import BGM from './BGM'; import CB from './ControlButton'; //const BGM=my.getBackgroundAudioManager(); /** * 定义当前组件事件 * */ const EVENT={} // 定义事件类型 EVENT.TYPE={ PLAYING:'PLAYING', PLAY_END:'PLAY_END', BUTTON_PRESS:'BUTTON_PRESS', PLAY_PAUSED:'PLAY_PAUSED', PLAY_ERROR:'PLAY_ERROR', BUTTON_STATE_UPDATE:'BUTTON_STATE_UPDATE', PLAY_STATE:'PLAY_STATE', }; let playError=(code)=>{ let errInfo=""; switch(code){ case 0: errInfo='[0]未知错误。'; break; case 35: errInfo='[35]解码失败,当前资源格式不支持。'; case 1001: errInfo="[1001]系统错误,请稍后重试。"; break; case 10001: errInfo="系统错误,请稍后重试。"; break; case 10002: errInfo="网络错误,检查网络稍后重试。"; break; case 10003: errInfo="资源播放失败,请稍后重试。"; break; case 10004: errInfo="资源格式错误,请稍后重试。"; break; case 20000: errInfo="播放资源为空"; break; case 20001: errInfo="播放失败,需要会员权限。"; break; case 20002: errInfo="播放失败,需要VIP会员权限。"; break; case 20003: //表示语音 errInfo="播放失败,当前操作播放条目无效。"; break; case 20004: errInfo="播放失败,当前已经是列表第一个项。"; break; case 20005: errInfo="播放失败,当前操作已经超出列表范围。"; break; case 20006: errInfo="播放失败,当前资源已失效过期。"; break; default: errInfo=`[${code}]错误,请检查网络或多媒体流量,稍后重试。`; break; } return errInfo; } //定义事件来源 EVENT.REFERER=[ {value:0,sign:'APP',info:'小程序自身按扭操作'}, {value:1,sign:'AUTO',info:'自动播放完成'}, {value:2,sign:'SYSTEM',info:'系统方控接收列表操作'}, {value:3,sign:'VGUI',info:'语音VGUI操作'} ]; // EVENT EVENT.build=(target,obj)=>{ /* * type:事件类型 * target:事件目标 * timeStamp:时间戳 * present:当前播放项索引 * referer:播放结束之后的来源信息 * * } */ let _timeStamp=Date.now(); let {type,present=target.data.present,presentTrack,referer,button=null,code,message,state}=obj; present=present?present:target.data.present; presentTrack=presentTrack?presentTrack:target.data.list[present]; referer=referer?referer:EVENT.REFERER[0]; let _event={ type:type, target:target.data.id, timeStamp:_timeStamp, present:present, list:target.data.list, total:target.data.total, presentTrack:presentTrack, referer:referer, button:button, code:code, message:message, state:state, } return _event; }; //格式化时间 const formatTime=(n)=>{ n=(Number.isNaN(n))?0:n; n=(n<0)?0:n; n=Math.floor(n); let h=Math.floor(n/3600) % 60; let m=Math.floor(n/60) % 60; // m=(m==Number.NaN)?0:m; let s=n% 60; //console.log(`h:${h},m:${m},s:${s}`) return (h>0?('0'+h).slice(-2)+':':'')+(('0'+m).slice(-2)+':')+('0'+s).slice(-2); } Component({ mixins: [], data: { track:{ title:'', singer:'', }, slider:{ disabled:true, value:0, max:0, valueString:'', maxString:'', }, sliderChanging:false, buttons:[], list:[], total:0, present:0, mode:CB.STATE.MODE_NORMAL, relation:null,// 关联列表对象 step:5, hue:0, // 默认色相 saturation:100, lightnessy:30, // 默认颜色的亮度 EVENT_TYPE:EVENT.TYPE, playStartTime:0, logo:'/logo.png', diskmode:false, diskmodeState:'', // diskmode状态的的图标的css 样式 }, props: { className:'hs-player' }, didMount() { //初始化对象 this._init(this.props); //重绘按扭 this._renderContinueButton(); // 初始化音频对象相关事件 BGM.onTimeUpdate((res)=>{ //console.log("BMG onTimeUpdate:"+ BGM.live); if(!this.data.sliderChanging){ // 拖动进度条状态下,不对进度进行时间变更重绘 let _disabled=BGM.live?true:false; this._renderSlider({value:BGM.currentTime,max:BGM.duration,disabled:_disabled,live:BGM.live}) } }); BGM.onCanplay((res)=>{ //console.log('canplaying-------'); this.setData({playStartTime:Date.now()}); //console.log('canplaying-------'+this.data.playStartTime); //console.log(res.data.isTrusted); this._renderButton({type:CB.TYPE.FORWARD,disabled:false}) this._renderButton({type:CB.TYPE.BACKWARD,disabled:false}) }); BGM.onPlay(()=>{ this._renderPlayButton(); this.setData({diskmodeState:'disk_play'}) }); BGM.onPause(()=>{ this._renderPlayButton(); this.setData({diskmodeState:'disk_pause'}) // 对转盘置为停止状态; }); BGM.onStop(()=>{ //console.log('stop-------'); this.setData({playStartTime:0}); this.setData({diskmodeState:'disk_pause'}) // 对转盘置为停止状态; }); BGM.onEnded((res)=>{ this._continuePlay({duration:CB.TYPE.NEXT,ignoreSingle:false,referer:1}); this._renderPlayButton(); }); BGM.onError((res)=>{ res= res || {}; let {errCode,error,errorCode,data={}}=res; let code=errCode || error || errorCode || data.errCode || data.error || data.errorCode || 0; code= parseInt(code,10) // 发起错误事件; this._renderSlider({value:0,max:0,disabled:true}); // 禁用进度条 this._renderButton({type:CB.TYPE.PLAY,state:CB.STATE.PLAY,disabled:true}) // 禁用播放按扭 if(this.props.onError){ this.props.onError({type:EVENT.TYPE.PLAY_ERROR,message:playError(code)});} }); BGM.onNext((res)=>{ this._continuePlay({duration:CB.TYPE.NEXT,ignoreSingle:true,referer:2}); this._renderPlayButton(); }); BGM.onPrev((res)=>{ this._continuePlay({duration:CB.TYPE.PREV,ignoreSingle:true,referer:2}); this._renderPlayButton(); }); // 获取系统主题变量 let {lightnessy_dark=30,lightnessy_light=70,logo=false,slogan=false,logoAnimation=''}=getApp().config || my.MIUE_CONFIG || {}; this.setData({lightnessy:lightnessy_dark}); if(logo){ this.setData({logo:logo}); this.setData({logoAnimation:logoAnimation}); } if(slogan){ this.setData({slogan:slogan}); } //console.warn(INFO); INFO.read().then((res)=>{ //console.warn(res); let _theme=res.theme || 'dark'; if(_theme=="light"){ //如果是明亮模式,则提高亮度 this.setData({lightnessy:lightnessy_light}); } }); }, didUpdate() { }, didUnmount() { }, methods: { _init(props){ //console.log(this.$page); //向所在的Page页面注册自己 let _id=props.id?props.id:'player_'+this.$id; if(this.$page.MIUE==undefined){ this.$page.MIUE=new Map(); } this.$page.MIUE.set(_id,this); this.setData({id:_id}); // 设置色相 hue let {hue=0,saturation=100,diskmode=false}=getApp().config || my.MIUE_CONFIG || {}; this.setData({hue:hue}); //设置封面模式 this.setData({diskmode:diskmode}); // 设置饱和度 let _saturation=props.saturation || saturation ; this.setData({saturation:_saturation}); //console.log("hue:"+ _hue); //快进 - 快退的 步长设置 if(props.step!=undefined){ let _step=Number(props.step); if(!Number.isNaN(_step)){ if(_step==0){ console.warn('player的step的设置有误,快进/快退 默认为 正负 5 秒。'); _step=5; } this.setData({step:_step}) }else{ console.warn('player的step的设置有误,快进/快退 默认为 正负 5 秒。'); } } //初始化播放器的按扭 let buttons_int,modes_int; if(props.buttons==undefined){ buttons_int="prev|play|next"; }else{ buttons_int=props.buttons; } //播放模式的设置 if(props.modes==undefined){ modes_int="normal|loop|single|random"; }else{ modes_int=props.modes; } //按扭设转化成数组 let buttonsArray=buttons_int.split('|'); //模式按扭可用状态转化成组数 let modes=modes_int.split('|'); this._initButtons({menus:buttonsArray,modes:modes}); }, _initButtons(obj){ //初始化控制按扭 let {menus,modes,progress=false}=obj; let _buttons=[]; menus.forEach((ele,idx)=>{ let disabled=this._verifyButtonDisabled(ele); // 当前按扭初始是不是可用状态 let states=null; if(ele=='mode'){ // 模式按扭,入参 states,当前只是可以配置 模式按扭是状态列表可配置。 states=modes; } let _cb=CB.create({type:ele,states:states,disabled:disabled}); if(_cb){_buttons.push(_cb)} }); this.setData({buttons:_buttons}); }, _verifyButtonDisabled(type){ //初始化 按扭的是否可用状态 // 变为小写,移除 + 号护展功能设置 type=type.replace(/\W+/ig,"") type=type.toLowerCase(); switch(type){ case CB.TYPE.PLAY: return (BGM.src==undefined)?true:false; break; case CB.TYPE.RATE: return (BGM.playbackRate==undefined)?true:false; break; case CB.TYPE.LIST: //return true; //return (this.data.list.length<1)?true:false; break; case CB.TYPE.NEXT: return (this.data.list.length<1)?true:false; break; case CB.TYPE.PREV: return (this.data.list.length<1)?true:false; break; case CB.TYPE.FORWARD: return (BGM.src=='')?true:false; break; case CB.TYPE.BACKWARD: return (BGM.src=='')?true:false; break; default: return false; break; } }, _renderPlayButton(){ //更新播放状态按扭和BGM对象的状态同步。 let state='play'; if(BGM.paused){ this._renderButton({type:CB.TYPE.PLAY,state:CB.STATE.PLAY,disabled:false}) state='paused'; }else{ this._renderButton({type:CB.TYPE.PLAY,state:CB.STATE.PAUSE,disabled:false}) } this.distributeEvent({type:EVENT.TYPE.PLAY_STATE,state:state}); }, //更新进度条状态 _renderSlider(sliderObj){ // 更新进度条件情况 // value:BGM.currentTime,max:BGM.duration,disabled:_disabled,live:BGM.live let _slider=this.data.slider; let {value,max,disabled=false,live}=sliderObj; value=Number(value); max=Number(max); //当前值不是数据或总长度不是数值,进度条不可用。 if(Number.isNaN(value) || Number.isNaN(max)){ disabled=true; } _slider.disabled=disabled; //处理百份比,当前值是数字的情况才对进度条进行设置 if(!Number.isNaN(value) && !Number.isNaN(max)){ value=Math.floor(value); max=Math.floor(max)+0.001; // 不能 0,所以加个数字;在一定情况下 0 对setData不生效,且百分比计算可能出错; _slider.value=value; _slider.max=max; _slider.valueString=formatTime(value); _slider.maxString=formatTime(max); //if(max>=value){ _slider.percent=Math.ceil(value/max * 100);// 百分比应用 ceil 向上取整; //} }else{ _slider.percent=0; } //console.log(`_slider.percent:${_slider.percent},value:${value},max:${max}`) //处理直播的多媒体 if(live){ _slider.maxString="直播"; /*if(value>0){ //当前时间有效时; _slider.valueString=formatTime(value); }else */ if(this.data.playStartTime>0){ _slider.valueString=formatTime((Date.now()-this.data.playStartTime)/1000); } _slider.value=0; _slider.max=100; _slider.percent=0; } //console.log(!this.data.sliderChanging); //console.log(_slider.percent); // 当不在拖动状态时才对进行条的进度进行setData操作 if(!this.data.sliderChanging){ //console.log(`对进度条进行复值:${_slider.value}`) this.setData({sliderValue:_slider.value}) } this.setData({slider:_slider}); }, _renderButton(buttonObj,direction){ //更新按扭状态 //argObj:type,state,disabled let {type,state,disabled=false}=buttonObj; let _buttons=this.data.buttons; _buttons.some((value, index, array)=>{ if(type==value.type){ //根据 direction 对顺序进行切换 if(direction!=undefined){ value.current=(value.current+direction) % value.states.length; state=value.states[value.current].key; } if(state!=undefined){ value.state=state; } value.disabled=disabled; return true; } }); this.setData({buttons:_buttons}); return {type:type,state:state,disabled:disabled}; }, _continuePlay(obj){ /* 继续播放控制函数 duration入参为TYPE.NEXT,或 TYPE.PREV referer入参:0=小程序按扭,1= 列表播放完成,2 = 系统方控,4= VGUI语音 ignoreSingle:是否忽略单曲控制,true:强制跳过单曲。 */ let {duration,referer=0,ignoreSingle=false}=obj; let {mode,present,list}= this.data; let _length=list.length; let _prevPresent=present; // 忽略单曲模式下,将模式切为顺序模式。 if(ignoreSingle && mode==CB.STATE.MODE_SINGLE) { mode=CB.STATE.MODE_NORMAL; } //console.log("mode:"+mode); let isStop=false; switch(mode){ //顺序播放 case CB.STATE.MODE_NORMAL: if(duration==CB.TYPE.NEXT){ present++; present=(present==_length)?_length-1:present; } if(duration==CB.TYPE.PREV){ present--; present=(present<0)?0:present; } break; //循环播放 case CB.STATE.MODE_LOOP: if(duration==CB.TYPE.NEXT){ present++; present=(present==_length)?0:present; } if(duration==CB.TYPE.PREV){ present--; present=(present<0)?_length-1:present; } break; //倒序 case CB.STATE.MODE_FORWARD: if(duration==CB.TYPE.NEXT){ present--; present=(present<0)?0:present; } if(duration==CB.TYPE.PREV){ present++; present=(present==_length)?present-1:present; } break; //随机 case CB.STATE.MODE_RANDOM: _prevPresent=null; present=Math.floor(_length*Math.random()); break; //单曲播 case CB.STATE.MODE_SINGLE: _prevPresent=null; break; default: return false; break; } // 变更的情况/设置列表,播控有效的情况 //console.warn(`present:${present},_prevPresent:${_prevPresent}`) if(present!=_prevPresent){ this.setData({present:present}); // console.warn(`present=_prevPresent,and this.play(present),present=${present}}`) this.play(present); }else{ //todo: 表示播放列表已经结束了 //播控无效了,表示已经结束播放。 if(present==_length-1){ this.distributeEvent({ type:EVENT.TYPE.PLAY_END, present:present, referer:EVENT.REFERER[referer] }); }else if(present==0){ // this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20004,message:playError(20004)}); } } //console.log("present end:"+present); }, _playSeekPosition(time){ let {currentTime,duration}=BGM; currentTime=currentTime+time; if(currentTime>duration){ currentTime=duration; } if(currentTime<0){ currentTime=0; } BGM.seek(currentTime); }, //重绘更新 上一首/下一首按扭 _renderContinueButton(type){ let {mode,present}=this.data; let isStop=false; let max=this.data.list.length-1; max=max<0?0:max; let _prev={type:CB.TYPE.PREV,disabled:false}; let _next={type:CB.TYPE.NEXT,disabled:false}; let _list={type:CB.TYPE.LIST,disabled:false}; if((mode==CB.STATE.MODE_NORMAL && present==0)||(mode==CB.STATE.MODE_SINGLE && present==0)||(mode==CB.STATE.MODE_FORWARD && present==max)){ _prev={type:CB.TYPE.PREV,disabled:true}; isStop=true; } if((mode==CB.STATE.MODE_NORMAL && present==max)||(mode==CB.STATE.MODE_SINGLE && present==max)||(mode==CB.STATE.MODE_FORWARD && present==0)){ _next={type:CB.TYPE.NEXT,disabled:true}; isStop=true; } //如果列表为空,上/下 按扭都不可用。 if(max==0){ _prev={type:CB.TYPE.PREV,disabled:true}; _next={type:CB.TYPE.NEXT,disabled:true}; _list={type:CB.TYPE.LIST,disabled:true}; } this._renderButton(_prev); this._renderButton(_next); this._renderButton(_list); return isStop; }, play(idx){ // idx= 列表索引值,或直obj.index, // console.log(`play(idx):idx=${idx}`); let _present; let _list=this.data.list; if(typeof(idx)=="number"){ _present=idx; } if(typeof(idx)=="object"){ _present=idx.index; } // 当前播放项目 let _presentTrack=_list[_present]; // 当播放项目不为空的情况进行 if(_presentTrack==undefined){ //console.warn(_present); if(_present<0){ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20004,message:playError(20004)}); }else if (_present>=_list.length){ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20005,message:playError(20005)}); }else{ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20003,message:playError(20003)}); } //throw('Play.play(idx) 无法播放,播放列表数据为空'); //return true; }else{ //设置当前是列表几第个~~ this.setData({present:_present}); //圆形进度条重为0; this.setData({percent:0}); //更新界面内容 let track=this.data.track; track.title=_presentTrack.title; track.singer=_presentTrack.singer; track.pic=_presentTrack.picture; track.comment=_presentTrack.comment; this.setData({track:track}); //渲染下一首/下一首是否可用 this._renderContinueButton(); //开始播放 let _src; if(typeof(_presentTrack)=="string"){ _src=_presentTrack; }else{ _src=_presentTrack.src; } //当资源不为空的情况下,抛出正常的播放事件; if(_src!=""){ let {expires=0}=_presentTrack; let _now=Date.now(); //console.log(`expires:${expires},now:${_now}`) if(expires>0 && expires<_now){ //console.log(`过期了~~`) this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20006,message:playError(20006)}); }else{ BGM.src=_presentTrack; this.distributeEvent({ type:EVENT.TYPE.PLAYING, present:_present, presentTrack:_presentTrack, }); } }else{ BGM.src=''; this._renderSlider({value:0,max:0,disabled:true}); // 禁用进度条 this._renderButton({type:CB.TYPE.PLAY,state:CB.STATE.PLAY,disabled:true}) // 禁用播放按扭 // 当资源为空的情况的细分处理,vip为VIP可用资源,member表示会员可用资源; if(_presentTrack.flag=='vip'){ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20002,message:playError(20002)}); }else if(_presentTrack.flag=='member'){ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20001,message:playError(20001)}); }else{ this.distributeEvent({type:EVENT.TYPE.PLAY_ERROR,code:20000,message:playError(20000)}); } } // 这里可以配直关联列表 if(this.data.relation!=null){ this.data.relation.setPresent(_present); } } }, setRelation(obj){ this.data.relation=obj; obj.data.relation=this; }, setListData(ls){ this.setData({total:0}); this.setData({list:ls}); this.setData({total:ls.length}); //列表重新赋值之后,需要重新计上一首/下一首/按扭可用性。 this._renderContinueButton(); }, setTotal(n){ this.setData({total:n}); }, onSliderChange(e){ BGM.seek(e.detail.value); this._renderSlider({value:e.detail.value,max:e.target.dataset.max,disabled:false}); this.setData({sliderChanging:false}); }, onSliderChanging(e){ //console.log(e); this.setData({sliderChanging:true}); this._renderSlider({value:e.detail.value,max:e.target.dataset.max,disabled:false}); }, onButtonTap(e){ //console.log(e); let direction=undefined; if(e.type=='tap'){ direction=1; } let {type,state,disabled=false}=e.target.dataset; // 如果 disabled= undefined 定义为 false let _event={type:type,state:state,disabled:disabled}; switch(type){ // 播放按扭被点击 case CB.TYPE.PLAY: if(state==CB.STATE.PAUSE){ BGM.pause(); _event.state=CB.STATE.PAUSE; }else if(state==CB.STATE.PLAY){ BGM.play(); _event.state=CB.STATE.PLAY; } break; case CB.TYPE.NEXT: // 下一首,忽略单曲模式 this._continuePlay({duration:type,ignoreSingle:true}); break; case CB.TYPE.PREV: // 上一首,忽略单曲模式 this._continuePlay({duration:type,ignoreSingle:true}); break; case CB.TYPE.FORWARD: //快进 this._playSeekPosition(this.data.step); break; case CB.TYPE.BACKWARD: //快退 this._playSeekPosition(-this.data.step); break; case CB.TYPE.LIST: // 列表被点击 _event=this._renderButton({type:type,state:state,disabled:false}); //_event=this._renderButton({type:type,state:state,disabled:false},direction); break; case CB.TYPE.FAVORITE: // 收藏按扭被击 break; case CB.TYPE.RATE: _event=this._renderButton({type:type,state:state,disabled:false},direction); break; case CB.TYPE.MODE: _event=this._renderButton({type:type,state:state,disabled:false},direction); //变更模式 this.setData({mode:_event.state}); //模式变化之后重绘 上一首/下一首 的状态。 this._renderContinueButton(CB.TYPE.MODE); break; default: break; } this.distributeEvent({ type:EVENT.TYPE.BUTTON_PRESS, button:_event, }); }, distributeEvent(obj){ let _event=EVENT.build(this,obj); let {type}=obj; //console.log(_event); switch(type){ // 按扭按下 case EVENT.TYPE.BUTTON_PRESS: if(this.props.onPress){this.props.onPress(_event);} break; //当前播放 case EVENT.TYPE.PLAYING: if(this.props.onPlaying){this.props.onPlaying(_event);} break; //播放结束 case EVENT.TYPE.PLAY_END: if(this.props.onEnded){ this.props.onEnded(_event);} break; case EVENT.TYPE.PLAY_STATE: if(this.props.onState){this.props.onState(_event);} break; //播放错误 case EVENT.TYPE.PLAY_ERROR: this.setData({diskmodeState:'disk_pause'}) // 对转盘置为停止状态; if(this.props.onError){ this.props.onError(_event);} break; default: return false; break; } }, get EVENT_TYPE(){ return EVENT.TYPE; }, get BUTTON_TYPE(){ return CB.TYPE; }, get BUTTON_STATES(){ return CB.STATE; }, //end distributeEvent //VGUI-语音命令处理函数 onVoiceCommand(e){ // 获取语音VGUI的热词 /* let {result=0,command={}}=e || {}; let {action}=command || {}; // action: next,previous,select switch(action){ case 'select': this.play(result); break; case 'next': this._continuePlay({duration:CB.TYPE.NEXT,ignoreSingle:true,referer:4}); this._renderPlayButton(); break; case 'previous': this._continuePlay({duration:CB.TYPE.PREV,ignoreSingle:true,referer:4}); this._renderPlayButton(); break; default: return false; break; } */ }, onVoiceAction(e){ let {querywords=''}=e; //获取Voice 的关健词 let {buttons}=this.data; buttons.forEach((ele,idx)=>{ let matchButton=ele.hasVoice(querywords); let {match=false,state,disabled}=matchButton || {}; if(match){ //是否命中语音注的词; let tapEvent={ type:'voice', timeStamp:Date.now(), target:{dataset:{ type:ele.type, state:state, disabled:disabled } } } this.onButtonTap(tapEvent); } }) }, setHue(s){ this.setData({hue:s}); }, // 设置播放模式; setMode(modeState){ // 模式不支持的情况; if(!CB.verify(CB.TYPE.MODE,modeState)){ console.warn('Player.SetMode() 设置失败,入参非法'); return false; } // 当前设置中是不是含这个; let mode=new Map(); let {buttons}=this.data; // console.log(buttons); buttons.forEach((ele,idx)=>{ if(ele.type==CB.TYPE.MODE){ mode=ele; } }) if(!mode.statesMap.has(modeState)){ console.warn(`Player.SetMode() 设置失败,原 mode 中不含${modeState}`) return false; } if(mode.state==modeState){ console.warn(`Player.SetMode() 设置失败,原 mode 已是 ${modeState}`) return false; } // console.warn(`Player.SetMode() 设置为:${modeState}`) let tapEvent={ type:'auto', timeStamp:Date.now(), target:{dataset:{ type:CB.TYPE.MODE, state:modeState, disabled:false } } } if(this.props.onUpdate){ this.props.onUpdate( { type:EVENT.TYPE.BUTTON_STATE_UPDATE, buttonType:CB.TYPE.MODE, original:CB.BUTTONS.get(CB.TYPE.MODE).legalStates.get(mode.state), current:CB.BUTTONS.get(CB.TYPE.MODE).legalStates.get(modeState) } );} this.onButtonTap(tapEvent); // console.log(tapEvent); }, onPlayerTap(e){ //console.log(e); if(this.props.onTap){ this.props.onTap(e);} }, onTest(e){ //this.onVoiceAction({querywords:'关闭列表'}); /* let event={ result:99, command:{ action:'select' } } this.onVoiceCommand(event); */ } // }, });