【Axure 創(chuàng)意教程】作為音樂白癡,我在 Axure 上“彈”起了鋼琴
如何利用Axure來實現(xiàn)創(chuàng)意產品設計或者某些小功能?本篇文章里,作者嘗試通過Axure設計了一個可以彈奏與播放的鋼琴音樂盒。感興趣的可以來看一下,也許會給你一點啟發(fā)。
作為非著名的不務正業(yè)的產品經理,最近喜歡通過 Axure 設計一些調劑生活情趣的小玩意兒,這次我?guī)淼氖侨绾斡?Axure 制作一個能彈奏,還能播放的鋼琴音樂盒,雖然復古的設計讓它看起來更像電子琴,但沒關系,當你按下琴鍵,你聽,它的確發(fā)出了鋼琴的聲音。體驗傳送門>>
本文主要分享設計這款產品時的一些難點以及實現(xiàn)方法,旨在提供一種思路,只要你掌握了這個思路,你完全可以在 Axure 上彈吉他、彈古箏,甚至彈棉花,所以本文不會把每個步驟都寫得非常詳實,如果你是那種喜歡照著教程復刻一個一模一樣產品出來的讀者,那么本文可能不太適合你。
一、發(fā)聲
首先我們要知道,Axure 中目前是無法添加本地的音頻或視頻進行播放的(也可能是我才疏學淺,還沒有 get 到這個技能),所以,我相信很多人最感興趣的就是按下琴鍵的時候,這個聲音是怎么發(fā)出來的,說破了就不值錢了,其實,是用了 Axure 的【內聯(lián)框架】組件。實現(xiàn)的思路是這樣的:
1)首先找到7個鋼琴音符的音頻素材。
2)把音頻素材上傳到網上,獲得每個素材的網址(上傳到音樂平臺沒有辦法獲得純凈的素材地址,它們都會給你的素材套一個播放頁面,搞得你沒有辦法獲得真正的素材地址,這是我遇到最大的一個問題點,因為這個問題我把這個設計到一半的產品擱置了一個多月,最后我是上傳到碼云 Gitee 上,才獲得每個素材的純凈網址,如果有讀者感興趣,歡迎留言,后續(xù)我可以單獨把這一步的操作整理一篇教程出來)。
3)在 Axure 頁面【負空間】拖入一個【內聯(lián)框架】。
4)給琴鍵添加【單擊】的交互,觸發(fā)的事件就是在【框架中打開鏈接】,而這個鏈接,就是對應的音符網址。
按上述步驟完成設置后,在預覽的網頁中按下琴鍵,就可以聽到網頁播放出對應音符的聲音,以下的圖片就是內聯(lián)框架在網頁中的樣子,實際上就是在內聯(lián)框架中打開音頻鏈接,在打開的時候,網頁會自動播放這個音頻聲音,舉一反三,這種操作方式,可以用于產品中任何需要播放音效的設計,比如刪除的時候播放刪除聲音,或者設計游戲中物體碰撞時發(fā)出的聲音等。
二、編曲
當琴鍵被按下的時候,上方的編曲區(qū)會記錄當前按下的音符,就像下方這樣:
這個其實非常簡單,上面的編曲區(qū)是一個【文本域】組件,在按下琴鍵的時候,只需要往【文本域】中添加對應音符的文字即可,但我相信這里肯定有很多的新手會遇到一個問題,就類似下面的演示效果:
新手疑惑:我明明設置的是按下的時候給【文本域】【設置文本】,但是不知道為什么之前已經填進去的文本總是會被清掉?
這里就需要分清楚【設置文本】和【追加文本】的區(qū)別了,我們都知道,Axure 有一個【設置文本】的事件,當觸發(fā)事件時,指定組件的文本會替換成要設置的文本,所以才會出現(xiàn)上述效果,但我們需要的效果是,之前已經輸入的文字要保留,我們只是需要在原來的內容后面【追加文本】,但 Axure 沒有【追加文本】的事件,那應該怎么操作呢?
這里就涉及到【變量】的用途了,思路是這樣子的:
- 首先需要添加一個【全局變量】。
- 當要往【文本域】中添加內容的時候,先獲取當前文本域的內容,賦值給變量。
- 在變量后面追加上要添加的文字。
- 將追加了文字后的內容再次復制給變量。
- 將變量值設置為【文本域】的文本。
我們再看一下這個產品是怎么實現(xiàn)的:
1)添加【全局變量】【song】用來存儲編曲內容。
2)給【文本域】添加【文本改變時】【設置變量值】的事件,這一步設置完成之后,只要【文本域】的內容發(fā)生改變,【全局變量】【song】馬上就會同步更新。
3)給對應的琴鍵添加【單擊時】的交互,這里的交互需要做兩件事:
- 首先【設置變量值】,將【song】+需要追加的文本(1,2,3等音符),然后重新賦值給【song】,這樣就得到了追加后完整的內容。
- 給編曲區(qū)的【文本域】【設置文本】,文本內容就是變量【song】。
這樣就能實現(xiàn)每次輸入都是在原有的文本基礎上追加內容,而不是重置內容的效果了。
三、播放
現(xiàn)在按下能夠播放音符,也能把每個音符記錄到編曲區(qū)了,那么怎么讓編曲區(qū)的樂曲完整地播放出來呢,這里就會用到動態(tài)面板的循環(huán)播放的特性,如果還不太懂的讀者可以先參考我的另一篇文章《【Axure 動態(tài)面板】讓你的動畫變成“永動機”》。關于動態(tài)面板的循環(huán)播放設置我就不再贅述,直接說明這個連續(xù)播放的實現(xiàn)思路:
- 讀取編曲區(qū)文本的第一個數字,判斷這個數字是什么,就在【內聯(lián)框架】打開對應的音頻鏈接播放音符。
- 播放之后,讀取編曲區(qū)文本的第二個數字,根據數字在【內聯(lián)框架】打開播放對應音頻。
- 以此類推,直到所有音符都播放完成。
這個思路有3個難點:
- 怎么讀取指定文本指定位置的文字。
- 怎么知道當前應該讀取哪個位置的文字。
- 怎么讓這個邏輯循環(huán)起來。
針對這3個難點,方案是這樣子的:
- Axure 提供了一個 JavaScript 的函數?charAt(index) 來讀取字符串中指定位置的字符,index 就是指定的位置,注意 index = 0,表示讀取第一個字符,1表示讀取第2個字符,以此類推。
- 由于我們是按順序讀取的,所以可以通過添加一個【全局變量】來作為 index 來存儲當前讀取的字符的位置,比如,變量值默認為0,就會讀取第一個字符,當我讀取完第一個字符時候,給這個變量值+1,這個時候變量值就變成了1,下一次讀取的時候,就會變成讀取第2個字符。
- 這就是上文提到的動態(tài)面板循環(huán)播放,我們可以在動態(tài)面板每一次【狀態(tài)改變時】,就讀取一個字符出來并進行播放。
這樣我們的思路基本就清晰了,接下來看一下具體是怎么做的吧:
1)在【全局變量】中添加【step】變量,默認值為0。
2)在頁面的【負空間】拖入一個動態(tài)面板,并添加2個狀態(tài),給動態(tài)面板設置【狀態(tài)改變時】的事件,下方是部分設置截圖,整體的思路是這樣子的:
- 如果變量【step】剛好等于編曲區(qū)的文字長度,就退出當前動態(tài)面板的循環(huán),也就是停止播放。
- 如果變量【step】小于編曲區(qū)的文字長度,則將 step 作為索引 index 從編曲區(qū)文字取出對應位置的值。
- 判斷取出的值是什么,就在【內聯(lián)框架】打開對應的音頻鏈接。
- 最后給變量【step】加上1,這樣下次循環(huán)時,通過 step 就可以取到編曲區(qū)的下一個值,一直到 step 等于編曲區(qū)的長度,滿足上述第1點,退出循環(huán),停止播放,這里需要注意的是,當動態(tài)面板退出循環(huán),音樂停止播放的時候,需要將【step】置為0,否則將會導致下次播放時出現(xiàn)異常。
3)給播放按鈕添加【點擊時】開啟【動態(tài)面板】循環(huán)事件,具體如下:
4)相信你看出來了,第3點的截圖條件有點多,其實這個就是播放速度的判斷條件,所謂的播放速度實際上就是通過控制動態(tài)面板的【循環(huán)間隔】來實現(xiàn)的。
通過以上4步,當我們點擊播放按鈕時,系統(tǒng)會判斷播放速度的選項以對應的時間來開啟【動態(tài)面板】的循環(huán),當 step 小于編曲區(qū)的內容長度時,每循環(huán)一次就會播放一個音符,直到 step 的長度等于編曲區(qū)的長度內容,表示整首樂曲播放完成,退出循環(huán),停止播放。
至于編曲區(qū)的頻譜,其實也是通過另外一個動態(tài)面板的循環(huán)來實現(xiàn)的,相信看過《【Axure 動態(tài)面板】讓你的動畫變成“永動機”》的讀者應該是很清楚怎么實現(xiàn)的,這個鋼琴的實現(xiàn)還是有多細節(jié)的地方,不過都不重要了,上面的要點,我相信已經講清楚這個產品的實現(xiàn)邏輯了。
文章很長,感謝閱讀!
本文由 @李燦榮 原創(chuàng)發(fā)布于人人都是產品經理,未經許可,禁止轉載。
題圖來自Unsplash,基于CC0協(xié)議。
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。
沒有聲音
檢查一下是不是不允許瀏覽器播放聲音,或者電腦的聲音是不是沒有打開
給作者腦洞點贊????,求音頻素材獲取教程
作者真的好有趣,你的作品我都要做一遍!