欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

只要demo可以拉到最底部。

一.歌詞控件效果。

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

主要效果有以下:

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

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

1.歌詞解析。

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

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

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

        if (line != null && line.length() > 0) {
          // 解析每一行歌詞 得到每行歌詞的集合,因為有些歌詞重復(fù)有多個時間,就可以解析出多個歌詞行來
          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是實現(xiàn)Comparable的類,保存了沒行歌詞的數(shù)據(jù),包括歌詞內(nèi)容、時間,實現(xiàn)Comparable可以通過時間來進(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ù),因為讀取的沒行數(shù)據(jù),如果長度過長就可能要通過多行才能顯示完,這時需要截取為多行顯示。

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.如果在手勢滑動狀態(tài),繪制時間線

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

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

三.下載地址,歡迎issue

github下載地址

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

相關(guān)文章

  • Android編程之截屏實現(xiàn)方法(包括scrollview與listview)

    Android編程之截屏實現(xiàn)方法(包括scrollview與listview)

    這篇文章主要介紹了Android編程之截屏實現(xiàn)方法,包括截取scrollview與listview屏幕的相關(guān)技巧,以及截屏圖片的生成與保存技巧,需要的朋友可以參考下
    2015-11-11
  • Android studio so庫找不到問題解決辦法

    Android studio so庫找不到問題解決辦法

    這篇文章主要介紹了Android studio so庫找不到問題解決辦法的相關(guān)資料,希望通過本文能幫助到大家解決出現(xiàn)的這種問題,需要的朋友可以參考下
    2017-10-10
  • Android開發(fā)自定義TextView省略號樣式的方法

    Android開發(fā)自定義TextView省略號樣式的方法

    這篇文章主要介紹了Android開發(fā)自定義TextView省略號樣式的方法,結(jié)合實例形式分析了Android文本控件TextView相關(guān)屬性與字符串操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android識別NFC芯片制造商的方法

    Android識別NFC芯片制造商的方法

    這篇文章介紹了Android識別NFC芯片制造商的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • Android HTTP網(wǎng)絡(luò)請求的異步實現(xiàn)

    Android HTTP網(wǎng)絡(luò)請求的異步實現(xiàn)

    這篇文章主要介紹了Android HTTP網(wǎng)絡(luò)請求的異步實現(xiàn),感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android 媒體庫數(shù)據(jù)更新方法總結(jié)

    Android 媒體庫數(shù)據(jù)更新方法總結(jié)

    這篇文章主要介紹了Android 媒體庫數(shù)據(jù)更新方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android 控件GridView使用案例講解

    Android 控件GridView使用案例講解

    這篇文章主要介紹了Android 控件GridView使用案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android學(xué)習(xí)項目之簡易版微信為例(二)

    Android學(xué)習(xí)項目之簡易版微信為例(二)

    這篇文章主要以簡易版微信為例,實現(xiàn)簡易版微信的登陸、注冊界面的編寫與簡單交互,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android使用IntentService進(jìn)行apk更新示例代碼

    Android使用IntentService進(jìn)行apk更新示例代碼

    這篇文章主要介紹了Android使用IntentService進(jìn)行apk更新示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Flutter 仿微信支付界面

    Flutter 仿微信支付界面

    網(wǎng)傳微信支付頁面的第三方鏈接一個格子需要廣告費1一個億,微信支付頁非常適合做功能導(dǎo)航,本篇使用 ListView和 GridView 模仿了微信支付的頁面,同時介紹了如何裝飾一個組件的背景和邊緣樣式。
    2021-05-05

最新評論