LrcView逐行歌詞

2021-08-03 22:21:33 字數 1913 閱讀 4095

今天來談談歌詞控制項的實現。大體思路

先解析歌詞,歌詞配合控制項的寬高計算座標(歌詞必須顯示在行的中間),然後進行繪製ondraw,最後就是事件處理(歌詞 拖動)和歌詞隨著時間自動移動,這個相對比較麻煩點。

小二   先上個圖看看效果

來一段歌詞源資料

[02:59.03][01:31.44]雙眼也不需要魅力的長髮也不需要魅力的長髮

[03:07.54][01:33.99]我真不知道我們的命運會這樣知道我們的命運會這樣

[03:16.36][01:38.59]我只能犧牲自己的感情離你遠去只能犧牲自己的感情離你遠去

[03:51.19][01:46.80]我只好讓你傷心的流淚

[03:52.94][01:57.69]遠離你的世界

[03:55.07][02:02.47]我其實不需要你美麗的雙眼

[03:57.81][02:06.22]也不需要魅力的長髮

按照上面格式對資料進行解析,這裡比較簡單

if (lrcs == null || lrcs.size() == 0) 

for (int i = 0, size = lrcs.size(); i < size; i++) else }}

這個時候不出意外的話,漂亮的歌詞已經顯示在你的手機上了,下面就要開始處理事件了ontouchevent。這裡就要用的系統提供的滑動工具類了scroller,只要給他傳入引數,它就可以控制控制項的移動。其實這裡也可以不用scroller,我們可以直接變換座標,也可以實現滑動效果,但是這樣就會一直在計算座標,效率有點略低

public boolean ontouchevent(motionevent event)  else if (getscrolly() > mlrcs.size() * wordhight) 

scrollby(getscrollx(), -(int) dury);

y = event.gety();}}

break;

case motionevent.action_up:

case motionevent.action_cancel:

int old = getscrolly();

if (old < 0) else if (getscrolly() > mlrcs.size() * wordhight)

if (isclick)

}invalidate();

ismoving = false;

break;

}return true;

}

細心的你肯定會發現這裡做了乙個小小的處理,當歌詞第一行歌詞或者最後乙個歌詞滑動到中間位置的時候,把滑動偏移量消耗了一部分,效果看起來會好點。

下面就是重頭戲,隨著時間自動滾動。

int indexline = mlrcdrawtool.getindexline();

if (prelrc != indexline)

getscrolly 這個方法很重要,getscrolly就是當前view的左上角相對於母檢視的左上角的y軸偏移量。 當歌詞第一移動上去,getscrolly的值也是變化一行歌詞的高度,通過這種方式就可以計算出每次歌詞的偏移量,然後給mscroller.startscroll(getscrollx(), old, getscrollx(), offset, durtime);傳值,實現自動滾動。

好了逐行歌詞已經完成,下面是demo位址

rhythmbox歌詞外掛程式之魯班歌詞

rhythmbox歌詞外掛程式之魯班歌詞 今天介紹另一款歌詞外掛程式sogou lyrics魯班歌詞 rblyrics 它是一款rhythmbox上的外掛程式,官方提供deb包,所以適合執行在ubuntu上。魯班歌詞的特性包括 auto scroll window,press left button...

DataList逐行繫結

事件 itemdatabound 內容 datalist 繫結資料 逐行建立,逐行繫結 先建立行容器 itemcreated事件 行物件建立完成後立即觸發 itemdatabind 行物件資料繫結完成後觸發 建立行itemcreated 建立行後 就來執行itemcreated事件 繫結行itemd...

天天動聽 懸浮歌詞 迷你歌詞 效果解讀

下面先來看一下效果。windowmanager.layoutparams params new windowmanager.layoutparams params.type windowmanager.layoutparams.type system overlay params.width win...