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 MediaPl
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值