最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

漂亮的Android音樂(lè)歌詞控件 仿網(wǎng)易云音樂(lè)滑動(dòng)效果

 更新時(shí)間:2018年01月04日 10:43:10   作者:楠之楓雪  
這篇文章主要為大家詳細(xì)介紹了漂亮的Android音樂(lè)歌詞控件,仿網(wǎng)易云音樂(lè)滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言: 項(xiàng)目有個(gè)音樂(lè)播發(fā)器功能,實(shí)現(xiàn)音樂(lè)在線播放,同時(shí)需要帶有歌詞顯示功能。網(wǎng)上也找過(guò),在github找到勉強(qiáng)能用的控件,只是效果還是差強(qiáng)人意,不是特別好。于是趁有空的時(shí)間,參考了網(wǎng)上的部分demo,自己也寫了個(gè)歌詞控件。

只要demo可以拉到最底部。

一.歌詞控件效果。

目前的歌詞控件效果如下:

主要效果有以下:

1.實(shí)現(xiàn)自動(dòng)滑動(dòng)切換到下一句。
2.實(shí)現(xiàn)滑動(dòng)歌詞切換播放時(shí)間。
3.實(shí)現(xiàn)拖動(dòng)歌詞時(shí)仿網(wǎng)易云音樂(lè)顯示時(shí)間線,將要選擇的歌詞顏色變化。
4.音樂(lè)進(jìn)度跳轉(zhuǎn)時(shí),歌詞跳轉(zhuǎn)可以滑動(dòng)切換。

二.歌詞控件實(shí)現(xiàn)邏輯說(shuō)明

1.歌詞解析。

歌詞文件問(wèn)lrc文件,歌詞內(nèi)容格式都是固定的[01:15.33] 或者 [00:00]這種格式。所以先把歌詞內(nèi)容通過(guò)一行一行的讀取,每讀取一行就解析。

List<LrcRow> rows = new ArrayList<LrcRow>();

      // 循環(huán)地讀取歌詞的每一行
      do {
        line = br.readLine();

        if (line != null && line.length() > 0) {
          // 解析每一行歌詞 得到每行歌詞的集合,因?yàn)橛行└柙~重復(fù)有多個(gè)時(shí)間,就可以解析出多個(gè)歌詞行來(lái)
          List<LrcRow> lrcRows = createRows(line);//解析行數(shù)據(jù)
          if (lrcRows != null && lrcRows.size() > 0) {
            for (LrcRow row : lrcRows) {
              rows.add(row);
            }
          }
        }
      } while (line != null);

private List<LrcRow> createRows(String standardLrcLine) {

    try {
      // [01:15.33] 或者 [00:00]這種格式
      Boolean Form1 = standardLrcLine.indexOf("[") == 0 && standardLrcLine.indexOf("]") == 9;
      Boolean Form2 = standardLrcLine.indexOf("[") == 0 && standardLrcLine.indexOf("]") == 6;

      if (!Form1 && !Form2) {
        return null;
      }

      int lastIndexOfRightBracket = standardLrcLine.lastIndexOf("]");

      String content = standardLrcLine.substring(lastIndexOfRightBracket + 1, standardLrcLine.length());   

      String times = standardLrcLine.substring(0, lastIndexOfRightBracket + 1).replace("[", "-").replace("]",
          "-");

      String arrTimes[] = times.split("-");
      List<LrcRow> listTimes = new ArrayList<LrcRow>();
      for (String temp : arrTimes) {
        if (temp.trim().length() == 0) {
          continue;
        }

        LrcRow lrcRow = new LrcRow(content, temp, timeConvert(temp));
        listTimes.add(lrcRow);
      }
      return listTimes;
    } catch (Exception e) {     
      return null;
    }
  }


LrcRow是實(shí)現(xiàn)Comparable的類,保存了沒(méi)行歌詞的數(shù)據(jù),包括歌詞內(nèi)容、時(shí)間,實(shí)現(xiàn)Comparable可以通過(guò)時(shí)間來(lái)進(jìn)行歌詞排序。

public class LrcRow implements Comparable<LrcRow>{

  private String RowData;//行數(shù)據(jù)
  private List<LrcShowRow> ShowRows = new ArrayList<LrcShowRow>();//顯示的行
  public String TimeText;
  public long CurrentRowTime;


LrcShowRow是繪制顯示的行數(shù)據(jù),因?yàn)樽x取的沒(méi)行數(shù)據(jù),如果長(zhǎng)度過(guò)長(zhǎng)就可能要通過(guò)多行才能顯示完,這時(shí)需要截取為多行顯示。

public class LrcShowRow implements Comparable<LrcShowRow> {

  public String Data;// 行數(shù)據(jù)
  public float RowHeight;// 行高度
  public float RowPadding;// 行間距
  public float YPosition =0;//繪畫y位置
  public int Index;//所在行坐標(biāo)


2.歌詞繪制

a.如果在手勢(shì)滑動(dòng)狀態(tài),繪制時(shí)間線

b.從第一行數(shù)據(jù)開始繪制,從頭到位將所有行數(shù)據(jù)繪制一遍。注意的是,第一行開始繪制坐標(biāo)FirstRowPositionY是動(dòng)態(tài)控制,目的是方便手勢(shì)滑動(dòng)或者執(zhí)行動(dòng)畫時(shí)改變這個(gè)坐標(biāo)就能實(shí)現(xiàn)控件滑動(dòng)效果。繪制過(guò)程中需要記錄每一行繪制的Y位置,這個(gè)坐標(biāo)的作用是為了執(zhí)行動(dòng)畫時(shí)計(jì)算需要的滑動(dòng)距離。如果當(dāng)前行是選中行或者如果當(dāng)前行是手勢(shì)滑動(dòng)時(shí)想要選擇的行,改變?yōu)閷?duì)應(yīng)的顯示顏色。

c.音樂(lè)播放時(shí)間跳轉(zhuǎn)時(shí),查找到歌詞中與跳轉(zhuǎn)時(shí)間最匹配的歌詞,拿到將要選中位置下標(biāo)TrySelectionPosition,然后執(zhí)行動(dòng)畫,執(zhí)行動(dòng)畫時(shí)先計(jì)算出總共偏移量然后一點(diǎn)點(diǎn)改變FirstRowPositionY偏移位置實(shí)現(xiàn)滑動(dòng)效果。動(dòng)畫執(zhí)行完成,將選中下標(biāo)更改為TrySelectionPosition。

三.下載地址,歡迎issue

github下載地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 基于Bitmap的四種圖片壓縮方式

    Android 基于Bitmap的四種圖片壓縮方式

    本文中探究的圖片壓縮方式主要是基于 Bitmap 的 api 實(shí)現(xiàn)。文中探究實(shí)現(xiàn)的壓縮方式有四種:質(zhì)量壓縮、采樣率壓縮、Matrix 縮放壓縮、圖片編碼格式壓縮,感興趣的朋友可以參考下
    2021-05-05
  • Android 仿淘寶商品屬性標(biāo)簽頁(yè)

    Android 仿淘寶商品屬性標(biāo)簽頁(yè)

    這篇文章主要介紹了Android 仿淘寶商品屬性標(biāo)簽頁(yè)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • 深入Android HandlerThread 使用及其源碼完全解析

    深入Android HandlerThread 使用及其源碼完全解析

    這篇文章主要介紹了深入Android HandlerThread 使用及其源碼完全解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 根據(jù)USER-AGENT判斷手機(jī)類型并跳轉(zhuǎn)到相應(yīng)的app下載頁(yè)面

    根據(jù)USER-AGENT判斷手機(jī)類型并跳轉(zhuǎn)到相應(yīng)的app下載頁(yè)面

    檢測(cè)瀏覽器的USER-AGENT,然后根據(jù)正則表達(dá)式來(lái)確定客戶端類型,并跳轉(zhuǎn)到相應(yīng)的app下載頁(yè)面,這個(gè)方法還是比較實(shí)用的,大家可以看看
    2014-09-09
  • Android Kotlin使用SQLite案例詳解

    Android Kotlin使用SQLite案例詳解

    這篇文章主要介紹了Android Kotlin使用SQLite案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Android控件之Spinner用法實(shí)例分析

    Android控件之Spinner用法實(shí)例分析

    這篇文章主要介紹了Android控件之Spinner用法,以實(shí)例形式較為詳細(xì)的分析了Spinner控件模擬下拉列表的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Android實(shí)現(xiàn)遮罩層(蒙板)效果

    Android實(shí)現(xiàn)遮罩層(蒙板)效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)遮罩層效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android實(shí)現(xiàn)數(shù)字跳動(dòng)效果的TextView方法示例

    Android實(shí)現(xiàn)數(shù)字跳動(dòng)效果的TextView方法示例

    數(shù)字跳動(dòng)效果相信大家應(yīng)該都見(jiàn)過(guò),在開發(fā)加上這種效果后會(huì)讓ui交互看起來(lái)非常不錯(cuò),所以下面這篇文章主要給大家介紹了Android實(shí)現(xiàn)數(shù)字跳動(dòng)的TextView的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-04-04
  • Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例

    Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例

    這篇文章主要為大家介紹了Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Android實(shí)現(xiàn)動(dòng)態(tài)切換組件背景的方法

    Android實(shí)現(xiàn)動(dòng)態(tài)切換組件背景的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)態(tài)切換組件背景的方法,需要的朋友可以參考下
    2014-07-07

最新評(píng)論

汽车| 姜堰市| 万全县| 高清| 保亭| 科技| 凉城县| 桂东县| 景泰县| 呈贡县| 东平县| 田阳县| 临澧县| 台前县| 黄山市| 和林格尔县| 隆回县| 建水县| 西畴县| 拉萨市| 青神县| 磐安县| 新河县| 象山县| 阿鲁科尔沁旗| 鹿邑县| 镶黄旗| 夹江县| 桐梓县| 宜宾县| 大安市| 百色市| 巨鹿县| 即墨市| 通州市| 阿瓦提县| 遂溪县| 顺义区| 长海县| 梁山县| 高邑县|