Android实现歌曲播放时歌词同步显示

我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:

public class LyricObject {   

    public int begintime; // 开始时间
    public int endtime; // 结束时间
    public int timeline; // 单句歌词用时
    public String lrc; // 单句歌词
}

可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词。在 UI线程中另起线程,通过回调函数 onDraw() 每隔100ms重新绘制屏幕,实现歌词平滑滚动的动画效果。 MainActivity代码如下:

import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;    

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    private LyricView lyricView;
    private MediaPlayer mediaPlayer;
    private Button button;
    private SeekBar seekBar;
    private String mp3Path;
    private int INTERVAL=45;//歌词每行的间隔    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);    

        mp3Path = Environment.getExternalStorageDirectory().getAbsolutePath() + 

"/LyricSync/1.mp3";    

        lyricView = (LyricView) findViewById(R.id.mylrc);
        mediaPlayer = new MediaPlayer();
        // this.requestWindowFeature(Window.FEATURE_NO_TITLE);    

        ResetMusic(mp3Path);
        SerchLrc();
        lyricView.SetTextSize();    

        button = (Button) findViewById(R.id.button);
        button.setText("播放");    

        seekBar = (SeekBar) findViewById(R.id.seekbarmusic);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {    

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub    

            }    

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub    

            }    

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                if (fromUser) {
                    mediaPlayer.seekTo(progress);
                    lyricView.setOffsetY(220 - lyricView.SelectIndex(progress)
                            * (lyricView.getSIZEWORD() + INTERVAL-1));    

                }
            }
        });    

        button.setOnClickListener(new OnClickListener() {    

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (mediaPlayer.isPlaying()) {
                    button.setText("播放");
                    mediaPlayer.pause();
                } else {
                    button.setText("暂停");
                    mediaPlayer.start();
                    lyricView.setOffsetY(220 - lyricView.SelectIndex(mediaPlayer.getCurrentPosition())
                            * (lyricView.getSIZEWORD() + INTERVAL-1));    

                }
            }
        });    

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                ResetMusic(mp3Path);
                lyricView.SetTextSize();
                lyricView.setOffsetY(200);
                mediaPlayer.start();
            }
        });
        seekBar.setMax(mediaPlayer.getDuration());
        new Thread(new runable()).start();
    }    

    public void SerchLrc() {
        String lrc = mp3Path;
        lrc = lrc.substring(0, lrc.length() - 4).trim() + ".lrc".trim();
        LyricView.read(lrc);
        lyricView.SetTextSize();
        lyricView.setOffsetY(350);
    }    

    public void ResetMusic(String path) {    

        mediaPlayer.reset();
        try {    

            mediaPlayer.setDataSource(mp3Path);
            mediaPlayer.prepare();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }    

    class runable implements Runnable {    

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {    

                try {
                    Thread.sleep(100);
                    if (mediaPlayer.isPlaying()) {
                        lyricView.setOffsetY(lyricView.getOffsetY() - lyricView.SpeedLrc());
                        lyricView.SelectIndex(mediaPlayer.getCurrentPosition());
                        seekBar.setProgress(mediaPlayer.getCurrentPosition());
                        mHandler.post(mUpdateResults);
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }    

    Handler mHandler = new Handler();
    Runnable mUpdateResults = new Runnable() {
        public void run() {
            lyricView.invalidate(); // 更新视图
        }
    };
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, mediaplayer
, android时间显示
, seekbar
, import
, android seekbar
, public
, getcurrentposition
, android 播放mp3
, 歌词
, #mediaplayer
, 解析单句SQL
, SeekBar滑动验证
seekbar用法
android实现歌词同步、android 同步播放歌词、android 数据同步实现、android 同步请求实现、js实现歌词同步,以便于您获取更多的相关知识。

时间: 2024-12-22 17:43:39

Android实现歌曲播放时歌词同步显示的相关文章

Android实现歌曲播放时歌词同步显示具体思路_Android

我们需要读取以上歌词文件的每一行转换成成一个个歌词实体: 复制代码 代码如下: public class LyricObject { public int begintime; // 开始时间 public int endtime; // 结束时间 public int timeline; // 单句歌词用时 public String lrc; // 单句歌词 } 可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词.在UI线程中另起线程,通过回调函数 onDra

Android实现歌曲播放时歌词同步显示具体思路

我们需要读取以上歌词文件的每一行转换成成一个个歌词实体: 复制代码 代码如下: public class LyricObject { public int begintime; // 开始时间 public int endtime; // 结束时间 public int timeline; // 单句歌词用时 public String lrc; // 单句歌词 } 可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词.在UI线程中另起线程,通过回调函数 onDra

MFC做播放器时怎么实现歌词同步显示

问题描述 MFC做播放器时怎么实现歌词同步显示 RT,大神们给个教程啥的一步步来的那种,直接看代码感觉太复杂了,看不懂那.. 解决方案 http://download.csdn.net/detail/qq_23668339/8732801教程,看<深入浅出MFC> 解决方案二: MFC制作音乐播放器的歌词同步问题http://download.csdn.net/detail/ouyangtianhan/3046678 解决方案三: 可以先打开一些歌词文件看看,基本的格式就是时间:歌词这样的,其

在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗

问题描述 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 解决方案 先搞明白是不是用了数据库,如果我用了,你就去查具体的查找代码,估计是没有匹配上

Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)

题外话:个别朋友总是问我同样的问题,做为一名c#/silverlight程序员为啥还要学flash ? 回 答:看日本片时,就不能对照看欧美的么? 不体会日本的细腻,又怎能感觉到欧美的粗放:同样都是web相关的技术,不必报门户之见:何况这二者有很多可以相互借鉴的东西. 注:这个例子来自[FL车在臣](在blueidea上又名"寂寞火山")翻译的"Animation in ActionScript3.0"一书,下面的原理分析也来自他的思路 原 理: 1.先分析一下ly

Jplayer歌词同步显示插件(在以前别人基础上修改)

1.该插件是一个jquery的编写的跟jplayer实现歌词同步的插件,最终效果如图: 2.首先引入jplayer的相关的js库和样式文件. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link href="skin/pink.flag/jplayer.pink.flag.css" rel="stylesheet"

LRC 歌词同步

LRC 歌词同步,大家看到了baidu在线歌词同步功能,现在我们也用flash实现lrc歌词同步下载和lrc歌词同步显示  大家也可以把这个文本内容复制下来,然后在"C:\My Player\LRC\"下创建一个文本文档,将内容粘贴上去,再将文档保存为"青花瓷.lrc",注意扩展名是".lrc". 二.LRC 内容分析     准备工作完成了,下面分析一下这个 LRC 文件.之所以叫 LRC ,是因为它是 Lyric (歌词) 的缩写.这种格式真

论HTML5 Audio 标签歌词同步的实现

HTML5草案里面其实有原生的字幕标签(<track> Tag)的,但使用的是vtt格式的文件,非常规的字幕(.sub, .srt)或歌词文件(.lrc). 用法如下(代码来自W3School): <video width="320" height="240" controls> <source src="forrest_gump.mp4" type="video/mp4"> <sou

android 播放器实现歌词的同步显示?

问题描述 利用android上面的知识点,怎么样在歌曲播放的时候,音乐播放的时间与所对应的歌词显示同步!希望各位朋友帮帮忙,或者给我发一个android播放器项目!我想知道里面运用到了那些方法,如何实现这样的功能!!android程序爱好者COMEON!! 解决方案 解决方案二:这问题应该发到android板块去可能会有人回答解决方案三:用的是哈希表的键值对<时间><歌词>