日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

auto.js制作简易音乐app(二)

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 auto.js制作简易音乐app(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 上一個(gè)版本只完成了音樂播放的功能,此次編寫實(shí)現(xiàn)了歌單搜索,歌曲選擇以及歌曲下載的功能,一些基本功能已經(jīng)大體完成了,后續(xù)也只是一些BUG處理,腳本邏輯完善等等。app及代碼下載在我的公眾號(hào):For My Future。

ui.layout(<vertical><SearchView id="search" w="*" h="50" marginTop="15"/><ListView id="list" bg="#B0E0E6"/><ListView id="namelist" w="*" h="*"/></vertical> );

? 上方搜索框是searchview控件,下方是兩個(gè)listview。

??searchview比input使用起來(lái)更麻煩一點(diǎn),選擇它是因?yàn)槭謾C(jī)用鍵盤輸入時(shí)會(huì)出現(xiàn)搜索的按鈕,如下圖紅圈標(biāo)識(shí)。第一個(gè)listview的功能是根據(jù)輸入自動(dòng)推薦相關(guān)歌曲名稱,類似我們百度輸入某些文字后輸入框下面出現(xiàn)的一些推薦詞條,如下圖藍(lán)框。第二個(gè)listview就是點(diǎn)擊搜索按鈕后相關(guān)歌曲信息的展示了。

?1.1搜索框功能編寫

? ? ?搜索框樣式設(shè)置:

ui.search.setIconified( false ); ui.search.setSubmitButtonEnabled(true); ui.search.setQueryHint( "請(qǐng)輸入音樂..." );//搜索的hint

??在功能編寫之前,首先要聲明一個(gè)storage,存儲(chǔ)獲得的音樂rid以及相關(guān)信息,方便腳本之間數(shù)據(jù)的傳遞。

var storage = storages.create("1216951671");

? 搜索框事件監(jiān)聽,具體詳解見代碼注釋。

ui.search.setOnQueryTextListener( {onQueryTextChange ( text ) { //監(jiān)聽搜索框內(nèi)容改變來(lái)推薦詞條if ( text.length > 0 ) {ui.list.setVisibility( 0 );// ui.list.setFilterText( text );//設(shè)置過濾器adapter.getFilter().filter( text );//過濾器與list綁定,具體介紹在后面} else {ui.list.setVisibility( 8 );//不可見ui.list.clearTextFilter();}return true;},onQueryTextSubmit(text){ //點(diǎn)擊搜索按鍵后所觸發(fā)的事件ui.list.setVisibility( 8 );if(text!=null){threads.start(function(){ //線程訪問網(wǎng)絡(luò),搜索歌曲let res =http.get("http://search.kuwo.cn/r.s?all="+text+"&ft=music& itemset=web_2021&client=kt&pn=0&rn=30&rformat=json&encoding=utf8")let html=res.body.string().replace(/'/g,'"');//雙引號(hào)替換單引號(hào)let json=JSON.parse(html);for(i=0;i<20;i++){//搜索20首歌,歌曲名字,時(shí)間,id,歌手分別放在對(duì)應(yīng)的列表中songnamelists[i]=json.abslist[i].SONGNAME;durationlists[i]=formatSeconds(json.abslist[i].DURATION);//fomatsecond時(shí)間戳轉(zhuǎn)化函數(shù),下文會(huì)具體介紹musicridlists[i]=json.abslist[i].MUSICRID;artistlists[i]=json.abslist[i].ARTIST; totallists[i]= songnamelists[i].toString()+"\t"+"\t"+ artistlists[i].toString()+"\t"+"\t"+durationlists[i].toString();//相關(guān)信息匯總在一個(gè)列表中 }})let adapter2 = new ArrayAdapter(context, android.R.layout.simple_expandable_list_item_1, totallists)ui.namelist.setAdapter(adapter2);//listview控件要與adapter綁定ui.namelist.setOnItemClickListener({onItemClick( parent, view, position, id){//position為 點(diǎn)擊歌曲時(shí)的位置media.stopMusic();//let s = adapter.getItem(position);musicrid = musicridlists[position];total = totallists[position];storage.put("musicrid", musicrid);//根據(jù)位置取列表中歌曲id及相關(guān)信息,storage可存儲(chǔ)所選歌曲信息,并發(fā)送給音樂播放歌曲界面,實(shí)現(xiàn)兩個(gè)腳本之間傳遞數(shù)據(jù)storage.put("total", total);log(storage.get("musicrid"));engines.execScriptFile("界面.js")//啟動(dòng)音樂播放器界面}})}// log(totallists);return true;} } );

? 1.2推薦詞條功能編寫

? ? ? 首先adapter與一個(gè)list進(jìn)行綁定,后續(xù)對(duì)列表數(shù)據(jù)的改動(dòng)就是通過adapter進(jìn)行操作的。

strArr = [ "許嵩", "如果當(dāng)時(shí)", "廬州月", "昨夜書", "最偉大的作品", "超市" ,"周杰倫" ];//本地推薦的詞條,當(dāng)然也可以通過網(wǎng)上的詞條api進(jìn)行添加 let adapter = new ArrayAdapter( context, android.R.layout.simple_expandable_list_item_1, strArr ); ui.list.setAdapter( adapter ); ui.list.setTextFilterEnabled( true );//啟動(dòng)過濾v ui.list.setVisibility( 8 );//一開始不顯示ListViewui.list.setOnItemClickListener({//監(jiān)聽list點(diǎn)擊onItemClick( parent, view, position, id){let s = adapter.getItem(position);ui.search.setQuery(s.toString(),true)}//點(diǎn)擊時(shí)將詞條內(nèi)容設(shè)置到搜索框中 })

? ? 1.3時(shí)間戳轉(zhuǎn)化

? ? ??通過api得到的音樂時(shí)長(zhǎng)是秒數(shù),所以還要設(shè)計(jì)函數(shù)轉(zhuǎn)化為分秒的格式。

function formatSeconds(value) {let secondTime = parseInt(value);// 秒let minuteTime = 0;// 分let hourTime = 0;// 小時(shí)if(secondTime > 60) {//如果秒數(shù)大于60,將秒數(shù)轉(zhuǎn)換成整數(shù)//獲取分鐘,除以60取整數(shù),得到整數(shù)分鐘minuteTime = parseInt(secondTime / 60);//獲取秒數(shù),秒數(shù)取余,得到整數(shù)秒數(shù)secondTime = parseInt(secondTime % 60);//如果分鐘大于60,將分鐘轉(zhuǎn)換成小時(shí)if(minuteTime > 60) {//獲取小時(shí),獲取分鐘除以60,得到整數(shù)小時(shí)hourTime = parseInt(minuteTime / 60);//獲取小時(shí)后取余的分,獲取分鐘除以60取余的分minuteTime = parseInt(minuteTime % 60);}}let result = "" + parseInt(secondTime) + "秒";if(minuteTime > 0) {result = "" + parseInt(minuteTime) + "分" + result;}if(hourTime > 0) {result = "" + parseInt(hourTime) + "小時(shí)" + result;}return result; }

二.歌曲下載功能musicv2.js文件編寫

??這個(gè)文件就是上一個(gè)教程的,再做一些修改即可。播放功能在上一個(gè)教程講解過,故不再贅述。下文詳細(xì)介紹如何進(jìn)行下載。

??首先創(chuàng)建存儲(chǔ)的文件夾,

var dirpath = "/sdcard/下載的音樂/"; files.ensureDir(dirpath);

? 在這個(gè)腳本用storage的功能得到search.js腳本傳遞過來(lái)的音樂的rid和相關(guān)信息。

var storage = storages.create("1216951671"); var musicrid = storage.get("musicrid"); var total = storage.get("total")

??然后取音樂直鏈進(jìn)行播放,

let songurl ="http://antiserver.kuwo.cn/anti.s?type=convert_url&rid="+musicrid+"&format=aac|mp3&response=url";let songurl1 = http.get(songurl);musicurl= songurl1.body.string()PlayMusic();

?當(dāng)點(diǎn)擊下載按鈕時(shí),根據(jù)這個(gè)直鏈進(jìn)行下載及保存。

ui.down.click(function(){threads.start(function(){let res = http.get(musicurl);files.writeBytes(dirpath+total+".mp3", res.body.bytes());toast("下載成功,打開手機(jī)自帶音樂播放器即可聆聽");media.scanFile(dirpath);//掃描,自動(dòng)添加到媒體庫(kù)})})

?最后,在手機(jī)自帶的音樂播放器即可找到下載的文件。

? 其實(shí)app還存在很多問題,比如說(shuō)音樂重音問題,如果正在聽音樂,這時(shí)返回重新搜索播放新歌曲,就會(huì)有二重音,所以在聽音樂界面返回搜索音樂界面的時(shí)候一定要去點(diǎn)暫停或者停止按鈕,這樣才不會(huì)造成重音。能用但有缺陷,所以這版的音樂app起名為音樂BUG版。

視頻演示地址:
https://b23.tv/CnGOyTU

app下載地址:

https://jianglaishi.lanzout.com/ipLGz08fy4qd
密碼:c1bv

代碼及更多教程在我的微信公眾號(hào)For My Future上,歡迎關(guān)注!

?

?

總結(jié)

以上是生活随笔為你收集整理的auto.js制作简易音乐app(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。