安卓音乐播放器歌词滚动显示

转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51386317

奇迹在相信它的人眼里才是奇迹

——— 歌德


本文系转载,出处已经标明,以前写播放器苦于音乐歌词的显示问题,当时解决的方法是去github找开源控件,无奈是别人的轮子,尺寸大小不对,只好凑活着用了,无聊逛了下csdn,发现有这篇文章,果断收藏。以后歌词显示就直接自己造轮子用了~~~~~~~~~



实现功能:


歌词显示及滚动事件实现
ViewPager使用

后续将博文,将实现已下载音乐扫描功能和已存在歌曲歌词下载。

因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐、下载音乐、下载歌词)均无法保证时效性,建议,尽快下载和练习;如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码。

截止到目前的源码下载:
http://download.csdn.net/album/detail/3105
(最新的,请下载最后一个,本博文对应版本2.1;如果需要逐步实现的过程,请下载所有)

欢迎移动开发爱好者交流:我的微信是iwanghang

另外,我打算开始找工作,如果沈阳或周边城市公司有意,也请与我联系。

实现效果如图:


实现代码如下:

PlayActivity如下:

[java]  view plain  copy
  1. package com.iwanghang.drmplayer;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.media.MediaPlayer;  
  5. import android.os.Bundle;  
  6. import android.os.Environment;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.ImageView;  
  15. import android.widget.SeekBar;  
  16. import android.widget.SeekBar.OnSeekBarChangeListener;  
  17. import android.widget.TextView;  
  18. import android.widget.Toast;  
  19.   
  20. import com.douzi.android.view.DefaultLrcBuilder;  
  21. import com.douzi.android.view.ILrcBuilder;  
  22. import com.douzi.android.view.ILrcView;  
  23. import com.douzi.android.view.LrcRow;  
  24. import com.douzi.android.view.LrcView;  
  25. import com.iwanghang.drmplayer.adapter.ViewPagerAdapter;  
  26. import com.iwanghang.drmplayer.utils.Constant;  
  27. import com.iwanghang.drmplayer.utils.ImageUtils;  
  28. import com.iwanghang.drmplayer.utils.MediaUtils;  
  29. import com.iwanghang.drmplayer.vo.Mp3Info;  
  30. import com.lidroid.xutils.db.sqlite.Selector;  
  31. import com.lidroid.xutils.exception.DbException;  
  32.   
  33. import java.io.BufferedReader;  
  34. import java.io.File;  
  35. import java.io.FileInputStream;  
  36. import java.io.FileNotFoundException;  
  37. import java.io.IOException;  
  38. import java.io.InputStreamReader;  
  39. import java.lang.ref.WeakReference;  
  40. import java.util.ArrayList;  
  41. import java.util.List;  
  42.   
  43. import static com.iwanghang.drmplayer.PlayService.ORDER_PLAY;  
  44. import static com.iwanghang.drmplayer.PlayService.RANDOM_PLAY;  
  45. import static com.iwanghang.drmplayer.PlayService.SINGLE_PLAY;  
  46.   
  47.   
  48. /** 
  49.  * PlayActivity 点击MyMusicListFragment(本地音乐)底部UI中的专辑封面图片打开的Activity 
  50.  */  
  51. public class PlayActivity extends BaseActivity implements OnClickListener, OnSeekBarChangeListener ,OnPageChangeListener {  
  52.     private TextView textView2_title;//歌名  
  53.     private ImageView imageView1_ablum;//专辑封面图片  
  54.     private SeekBar seekBar1;//进度条  
  55.     private TextView textView1_start_time, textView1_end_time;//开始时间,结束时间  
  56.     private ImageView imageView1_play_mode;//菜单  
  57.     private ImageView imageView3_previous, imageView2_play_pause, imageView1_next;//上一首,播放暂停,下一首  
  58.     private ImageView imageView1_ablum_reflection;//专辑封面图片倒影  
  59.     private ImageView imageView1_favorite;//收藏按钮  
  60.   
  61.     //private ArrayList<Mp3Info> mp3Infos;  
  62.     //private int position;//当前播放的位置  
  63.     private boolean isPause = false;//当前播放的是否为暂停状态  
  64.     private static final int UPDATE_TIME = 0x10;//更新播放事件的标记  
  65.   
  66.     private DRMPlayerApp app;//取出全局对象 方便调用  
  67.   
  68.     //歌词  
  69.     private ViewPager viewPager;  
  70.     private LrcView lrcView;// 自定义歌词视图  
  71.     private ArrayList<View> views = new ArrayList<>();  
  72.     private static final int UPDATE_LRC = 0x20;//更新播放事件的标记  
  73.     ILrcView mLrcView;  
  74.     public final static String TAG = "PlayActivity";  
  75.     private MediaPlayer mPlayer;  
  76.     private ViewPagerAdapter adapter;  
  77.   
  78.     @Override  
  79.     protected void onCreate(Bundle savedInstanceState) {  
  80.         super.onCreate(savedInstanceState);  
  81.         setContentView(R.layout.activity_music_play);  
  82.         //取出全局对象 方便调用  
  83.         app = (DRMPlayerApp) getApplication();  
  84.         //初始化界面信息  
  85.         //textView2_title = (TextView) findViewById(R.id.textView2_title);//歌名  
  86.         //imageView1_ablum = (ImageView) findViewById(R.id.imageView1_ablum);//专辑封面图片  
  87.         seekBar1 = (SeekBar) findViewById(R.id.seekBar1);//进度条  
  88.         textView1_start_time = (TextView) findViewById(R.id.textView1_start_time);//开始时间  
  89.         textView1_end_time = (TextView) findViewById(R.id.textView1_end_time);//结束时间  
  90.         imageView1_play_mode = (ImageView) findViewById(R.id.imageView1_play_mode);//菜单  
  91.         imageView3_previous = (ImageView) findViewById(R.id.imageView3_previous);//上一首  
  92.         imageView2_play_pause = (ImageView) findViewById(R.id.imageView2_play_pause);//播放暂停  
  93.         imageView1_next = (ImageView) findViewById(R.id.imageView1_next);//下一首  
  94.         imageView1_favorite = (ImageView) findViewById(R.id.imageView1_favorite);//收藏按钮  
  95.         lrcView = (LrcView) findViewById(R.id.lrcView);//自定义歌词视图  
  96.   
  97.         //注册按钮点击监听事件  
  98.         imageView1_play_mode.setOnClickListener(this);  
  99.         imageView2_play_pause.setOnClickListener(this);  
  100.         imageView3_previous.setOnClickListener(this);  
  101.         imageView1_next.setOnClickListener(this);  
  102.         seekBar1.setOnSeekBarChangeListener(this);  
  103.         imageView1_favorite.setOnClickListener(this);  
  104.   
  105.   
  106.         //mp3Infos = MediaUtils.getMp3Infos(this);  
  107.         //bindPlayService();//绑定服务,异步过程,绑定后需要取得相应的值,来更新界面  
  108.         myHandler = new MyHandler(this);  
  109.   
  110.         //独立音乐播放界面 和 歌词界面  
  111.         //viewPager = (ViewPager) findViewById(R.id.fgv_player_main);  
  112.         viewPager = (ViewPager) findViewById(R.id.viewpager);  
  113.         initViewPager();//初始化  
  114.           
  115.   
  116.         //以下直接调用change()是不行的,因为异步问题,会发生NullPointerException空指针异常  
  117.         //从MyMusicListFragment的专辑封面图片点击时间传过来的position(当前播放的位置)  
  118.         //position = getIntent().getIntExtra("position",0);  
  119.         //change(position);  
  120.   
  121.         //通过在BaseActivity中绑定Service,添加如下代码实现change()  
  122.         //musicUpdatrListener.onChange(playService.getCurrentProgeress());  
  123.   
  124.         //从MyMusicListFragment的专辑封面图片点击时间传过来的isPause(当前播放的是否为暂停状态)  
  125.         //isPause = getIntent().getBooleanExtra("isPause",false);  
  126.   
  127.         //        mLrcView = new LrcView(this, null);  
  128.         //        setContentView((View) mLrcView);  
  129.         //  
  130.         //        //在目标位置读取lrc文件  
  131.         //        File LrcDirFile = new File(Environment.getExternalStorageDirectory() + Constant.DIR_LRC);  
  132.         //        System.out.println("LrcDirFile : " + LrcDirFile);  
  133.         //        if (!LrcDirFile.exists()) {  
  134.         //            LrcDirFile.mkdirs();  
  135.         //        }  
  136.         //        //把lrc转成字符串  
  137.         //        String lrc = LrcDirFile + "/" + "山丘" + ".lrc";  
  138.         //        //Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.  
  139.         //        Log.d(TAG, "lrc:" + lrc);  
  140.         //  
  141.         //        //把lrc的字符串 转成数组  
  142.         //        ILrcBuilder builder = new DefaultLrcBuilder();  
  143.         //        List<LrcRow> rows = builder.getLrcRows(lrc);  
  144.         //  
  145.         //        //把lrc数组 设置到mLrcView里  
  146.         //        mLrcView.setLrc(rows);  
  147.         //        //beginLrcPlay();  
  148.         //  
  149.         //        //设置监听器,监听歌词滚动  
  150.         //        mLrcView.setListener(new ILrcView.LrcViewListener() {  
  151.         //            public void onLrcSeeked(int newPosition, LrcRow row) {  
  152.         //                if (mPlayer != null) {  
  153.         //                    Log.d(TAG, "onLrcSeeked:" + row.time);  
  154.         //                    mPlayer.seekTo((int)row.time);//用户滑动歌词界面,调整进度  
  155.         //                }  
  156.         //            }  
  157.         //        });  
  158.     }  
  159.   
  160.   
  161.     private void initViewPager() {//专辑封面图片Pager与歌词Pager  
  162.         //View album_image_layout = getLayoutInflater().inflate(R.layout.album_image_layout, null);  
  163.         //System.out.println("PlayActivity.initViewPager.album_image_layout:" + album_image_layout);  
  164.   
  165.         View album_image_layout = LayoutInflater.from(getApplicationContext()).inflate(R.layout.album_image_layout, null);  
  166.         System.out.println("PlayActivity.initViewPager.album_image_layout:" + album_image_layout);  
  167.         //初始化界面信息  
  168.   
  169.         //textView2_title = (TextView) findViewById(R.id.textView2_title);//歌名  
  170.         //这里要注意下,直接findViewById,返回的是textView2_title是null;像下面这样,加上layout才可以,否则在change的时候会报空指针异常  
  171.         textView2_title = (TextView) album_image_layout.findViewById(R.id.textView2_title);//歌名  
  172.         //System.out.println("PlayActivity.initViewPager.textView2_title:" + textView2_title);  
  173.         //System.out.println("PlayActivity.initViewPager.textView2_title.getText:" + textView2_title.getText());  
  174.   
  175.   
  176.         imageView1_ablum = (ImageView) album_image_layout.findViewById(R.id.imageView1_ablum);//专辑封面图片  
  177.   
  178.         imageView1_ablum_reflection = (ImageView) album_image_layout.findViewById(R.id.imageView1_ablum_reflection);//专辑封面图片倒影  
  179.   
  180.         views.add(album_image_layout);//添加专辑封面图片Pager  
  181.   
  182.   
  183.   
  184.         //View lrc_layout = getLayoutInflater().inflate(R.layout.lrc_layout, null);  
  185.   
  186.   
  187.         View lrc_layout = LayoutInflater.from(getApplicationContext()).inflate(R.layout.lrc_layout, null);  
  188.         System.out.println("PlayActivity.initViewPager.lrc_layout:" + lrc_layout);  
  189.   
  190.   
  191.   
  192.         lrcView = (LrcView) lrc_layout.findViewById(R.id.lrcView);  
  193.         //设置滚动事件  
  194.         lrcView.setListener(new ILrcView.LrcViewListener() {  
  195.             @Override  
  196.             public void onLrcSeeked(int newPosition, LrcRow row) {  
  197.                 if (playService.isPlaying()) {  
  198.                     playService.seekTo((int) row.time);  
  199.                 }  
  200.             }  
  201.         });  
  202.         lrcView.setLoadingTipText("正在加载歌词......");  
  203.         lrcView.setBackgroundResource(R.mipmap.app_splash_bg);  
  204.         lrcView.getBackground().setAlpha(150);//背景透明度0-255  
  205.         views.add(lrc_layout);  
  206.         System.out.println("PlayActivity.initViewPager.views:" + views);  
  207.   
  208.   
  209.   
  210.         //adapter = new ViewPagerAdapter(views);  
  211.         adapter = new ViewPagerAdapter(views);  
  212.         viewPager.setAdapter(adapter);  
  213.   
  214.   
  215.   
  216.   
  217.         //viewPager.setAdapter(new ViewPagerAdapter(views));  
  218.         System.out.println("PlayActivity.initViewPager.viewPager:" + viewPager);  
  219.         viewPager.addOnPageChangeListener(this);  
  220.         System.out.println("PlayActivity.initViewPager.viewPager:" + viewPager);  
  221.     }  
  222.   
  223.   
  224.   
  225.   
  226.   
  227.   
  228.     //把播放服务的绑定和解绑放在onResume,onPause里,好处是,每次回到当前Activity就获取一次播放状态  
  229.     @Override  
  230.     protected void onResume() {  
  231.         super.onResume();  
  232.         bindPlayService();//绑定服务  
  233.     }  
  234.   
  235.     @Override  
  236.     protected void onPause() {  
  237.         super.onPause();  
  238.         unbindPlayService();//解绑服务  
  239.     }  
  240.   
  241.     @Override  
  242.     protected void onDestroy() {  
  243.         super.onDestroy();  
  244.         unbindPlayService();//解绑服务  
  245.     }  
  246.   
  247.     //Handler用于更新已经播放时间  
  248.     private static MyHandler myHandler;  
  249.   
  250.     //进度条改变 (fromUser 是否来自用户的改变 , 而不是程序自身控制的改变)  
  251.     @Override  
  252.     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
  253.         if (fromUser) {  
  254.             //playService.pause();//暂停  
  255.             playService.seekTo(progress);//寻找指定的时间位置 (跳到某个时间点进行播放)  
  256.             //playService.start();//播放  
  257.         }  
  258.     }  
  259.   
  260.     //进度条开始触摸  
  261.     @Override  
  262.     public void onStartTrackingTouch(SeekBar seekBar) {  
  263.   
  264.     }  
  265.   
  266.     //进度条停止触摸  
  267.     @Override  
  268.     public void onStopTrackingTouch(SeekBar seekBar) {  
  269.   
  270.     }  
  271.   
  272.     //页面滚动  
  273.     @Override  
  274.     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  275.   
  276.     }  
  277.   
  278.     //页面选择  
  279.     @Override  
  280.     public void onPageSelected(int position) {  
  281.   
  282.     }  
  283.   
  284.     //页面滚动状态改变  
  285.     @Override  
  286.     public void onPageScrollStateChanged(int state) {  
  287.   
  288.     }  
  289.   
  290.   
  291.     static class MyHandler extends Handler {  
  292.         private PlayActivity playActivity;  
  293.         private WeakReference<PlayActivity> weak;//弱引用  
  294.   
  295.         public MyHandler(PlayActivity playActivity) {  
  296.             //this.playActivity = playActivity;  
  297.             weak = new WeakReference<PlayActivity>(playActivity);  
  298.         }  
  299.   
  300.         @Override  
  301.         public void handleMessage(Message msg) {  
  302.             super.handleMessage(msg);  
  303.             //System.out.println("PlayActivity.MyHandler.weak = " + weak);  
  304.             playActivity = weak.get();  
  305.             //System.out.println("PlayActivity.MyHandler.playActivity = " + playActivity);  
  306.             if (playActivity != null) {  
  307.                 switch (msg.what) {  
  308.                     case UPDATE_TIME://更新时间(已经播放时间)  
  309.                         playActivity.textView1_start_time.setText(MediaUtils.formatTime((int) msg.obj));  
  310.                         break;  
  311.                     case UPDATE_LRC:  
  312.                         playActivity.lrcView.seekLrcToTime((int) msg.obj);  
  313.                         break;  
  314.                     default:  
  315.                         break;  
  316.                 }  
  317.             }  
  318.         }  
  319.     }  
  320.   
  321.     @Override  
  322.     public void publish(int progress) {  
  323.         //以下是是直接调用线程,但是不能这样做,会报错,线程异常  
  324.         //textView1_start_time.setText(MediaUtils.formatTime(progress));  
  325.         //所以,我们需要使用Handler  
  326.         //Message msg = myHandler.obtainMessage(UPDATE_TIME);//用于更新已经播放时间  
  327.         //msg.arg1 = progress;//用于更新已经播放时间  
  328.         //myHandler.sendMessage(msg);//用于更新已经播放时间  
  329.   
  330.         //seekBar1.setProgress(progress);  
  331.   
  332.         myHandler.obtainMessage(UPDATE_TIME, progress).sendToTarget();  
  333.         seekBar1.setProgress(progress);  
  334.         myHandler.obtainMessage(UPDATE_LRC, progress).sendToTarget();  
  335.         //System.out.println("PlayActivity.publish.myHandler = " + myHandler);  
  336.         //System.out.println("PlayActivity.publish.UPDATE_LRC = " + UPDATE_LRC);  
  337.         //System.out.println("PlayActivity.publish.progress = " + progress);  
  338.     }  
  339.   
  340.     @Override  
  341.     public void change(int position) {//初始化,独立播放界面的歌曲切换后的初始化界面上的歌曲信息  
  342.         //if (this.playService.isPlaying()) {//获取是否为播放状态  
  343.         //System.out.println("PlayActivity.change.position = " + position);  
  344.         Mp3Info mp3Info = playService.mp3Infos.get(position);  
  345.         //System.out.println("PlayActivity.change.getTitle = " + mp3Info.getTitle());  
  346.         textView2_title.setText(mp3Info.getTitle());//设置歌名  
  347.         //textView2_title.setTtileText(mp3Info.getTitle());//设置歌名  
  348.         //System.out.println("PlayActivity.change.textView2_title = " + textView2_title);  
  349.         //System.out.println("PlayActivity.change.getText : " + textView2_title.getText());  
  350.         //System.out.println("PlayActivity.change.getText : " + textView2_title.getTtileText());  
  351.   
  352.   
  353.         //下面这句话是提交更新UI的,但是这个功能在adapter里面实现了,但是实现的方式,只适合UI需要更新的内容很少的时候  
  354.         //而且,就算使用,也是设置了专辑图片和倒影,以后使用,不是这里.  
  355.         //之所以放在这里,是因为我开始调试的时候,无法setText,最后通过Debug找到了问题所在  
  356.         //以后我会专门开个博文,介绍一下Debug  
  357.         //adapter.notifyDataSetChanged();  
  358.   
  359.         //setText后,歌名没有显示,但是可以getText,尝试隐藏/显示,来刷新UI,结果歌名还是没有显示  
  360.         //viewPager.setVisibility(View.GONE);  
  361.         //getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.activity_music_play);  
  362.         //viewPager.setVisibility(View.VISIBLE);  
  363.   
  364.         //setText后,歌名没有显示,但是可以getText,尝试隐藏/显示,来刷新UI,结果歌名还是没有显示  
  365.         //viewPager.setVisibility(View.GONE);  
  366.         //viewPager.setVisibility(View.VISIBLE);  
  367.   
  368.   
  369.         //获取专辑封面图片  
  370.         Bitmap albumBitmap = MediaUtils.getArtwork(this, mp3Info.getId(), mp3Info.getAlbumId(), truefalse);  
  371.         //改变播放界面专辑封面图片  
  372.         imageView1_ablum.setImageBitmap(albumBitmap);  
  373.         textView1_end_time.setText(MediaUtils.formatTime(mp3Info.getDuration()));//设置结束时间  
  374.         imageView2_play_pause.setImageResource(R.mipmap.app_music_pause);//设置暂停图片  
  375.         seekBar1.setProgress(0);//设置当前进度为0  
  376.         seekBar1.setMax((int) mp3Info.getDuration());//设置进度条最大值为MP3总时间  
  377.         if (playService.isPlaying()) {  
  378.             imageView2_play_pause.setImageResource(R.mipmap.app_music_pause);  
  379.         } else {  
  380.             imageView2_play_pause.setImageResource(R.mipmap.app_music_play);  
  381.         }  
  382.   
  383.         if (imageView1_ablum != null) {  
  384.             imageView1_ablum_reflection.setImageBitmap(ImageUtils.createReflectionBitmapForSingle(albumBitmap));//显示倒影  
  385.         }  
  386.         switch (playService.getPlay_mode()) {  
  387.             case ORDER_PLAY://顺序播放  
  388.                 imageView1_play_mode.setImageResource(R.mipmap.app_mode_order);  
  389.                 //imageView2_play_pause.setTag(ORDER_PLAY);  
  390.                 break;  
  391.             case PlayService.RANDOM_PLAY://随机播放  
  392.                 imageView1_play_mode.setImageResource(R.mipmap.app_mode_random);  
  393.                 //imageView2_play_pause.setTag(RANDOM_PLAY);  
  394.                 break;  
  395.             case PlayService.SINGLE_PLAY://单曲循环  
  396.                 imageView1_play_mode.setImageResource(R.mipmap.app_mode_single);  
  397.                 //imageView2_play_pause.setTag(SINGLE_PLAY);  
  398.                 break;  
  399.             default:  
  400.                 break;  
  401.         }  
  402.   
  403.         long id = getId(mp3Info);  
  404.   
  405.         //初始化收藏状态  
  406.         try {  
  407.             Mp3Info loveMp3Info = app.dbUtils.findFirst(Selector.from(Mp3Info.class).where("mp3InfoId""=", mp3Info.getMp3InfoId()));//查出歌曲,SQL语句  
  408.             System.out.println("初始化收藏状态" + loveMp3Info);  
  409. //            if (loveMp3Info != null) {  
  410. //                imageView1_favorite.setImageResource(R.mipmap.app_love_selected);  
  411. //            } else {  
  412. //                imageView1_favorite.setImageResource(R.mipmap.app_love_unselected);  
  413. //            }  
  414.             if (loveMp3Info != null) {  
  415.                 System.out.println("loveMp3Info.getIsLove() = " + loveMp3Info.getIsLove());  
  416.                 if (loveMp3Info.getIsLove() == 0) {//返回值不为null,且,isLove为0时,也显示为'未收藏'  
  417.                     imageView1_favorite.setImageResource(R.mipmap.app_love_unselected);  
  418.                 }else {//返回值为null,且,isLove为1时,一定显示为'已收藏'  
  419.                     imageView1_favorite.setImageResource(R.mipmap.app_love_selected);  
  420.                 }  
  421.             } else {//返回值为null,一定显示为'未收藏'  
  422.                 imageView1_favorite.setImageResource(R.mipmap.app_love_unselected);  
  423.             }  
  424.         } catch (DbException e) {  
  425.             e.printStackTrace();  
  426.         }  
  427.   
  428.         //歌词  
  429.         String songName = mp3Info.getTitle();  
  430.         //歌词功能还不完善,后面会博文,会继续完善,暂时使用我已经下载好的lrc测试效果.  
  431.         songName = "山丘";//测试用的lrc的歌名  
  432.         String lrcPath = Environment.getExternalStorageDirectory() + Constant.DIR_LRC + "/" + songName + ".lrc";  
  433.         File lrcFile = new File(lrcPath);  
  434.         if (!lrcFile.exists()){  
  435.             //下载  
  436.             System.out.println("请下载歌词");  
  437.         }else{  
  438.             loadLRC(lrcFile);  
  439.         }  
  440.     }  
  441.   
  442.     //如果是本地音乐,id就是id;如果是收藏音乐,id则是mp3InfoId  
  443.     //提供给 收藏按钮 点击事件时 调用.  
  444.     private long getId(Mp3Info mp3Info){  
  445.         //初始收藏状态  
  446.         long id = 0;  
  447.         switch (playService.getChangePlayList()){  
  448.             case PlayService.MY_MUSIC_LIST:  
  449.                 System.out.println("当前为本地列表");  
  450.                 id = mp3Info.getId();  
  451.                 System.out.println("id =" + id);  
  452.                 break;  
  453.             case PlayService.LOVE_MUSIC_LIST:  
  454.                 System.out.println("当前为收藏列表");  
  455.                 id = mp3Info.getMp3InfoId();  
  456.                 System.out.println("id =" + id);  
  457.                 break;  
  458.             default:  
  459.                 break;  
  460.         }  
  461.         return id;  
  462.     }  
  463.   
  464.     //点击事件  
  465.     @Override  
  466.     public void onClick(View v) {  
  467.         switch (v.getId()) {  
  468.             case R.id.imageView2_play_pause: {//播放暂停按钮  
  469.                 if (playService.isPlaying()) {//如果是播放状态  
  470.                     imageView2_play_pause.setImageResource(R.mipmap.app_music_play);//设置播放图片  
  471.                     playService.pause();  
  472.                 } else {  
  473.                     if (playService.isPause()) {  
  474.                         imageView2_play_pause.setImageResource(R.mipmap.app_music_pause);//设置暂停图片  
  475.                         playService.start();//播放事件  
  476.                     } else {  
  477.                         //只有打开APP没有点击任何歌曲,同时,直接点击暂停播放按钮时.才会调用  
  478.                         //playService.play(0);  
  479.   
  480.                         //只有打开APP没有点击任何歌曲,同时,直接点击暂停播放按钮时.才会调用  
  481.                         //默认播放的是,在PlayService的onCreate中 恢复状态值  
  482.                         playService.play(playService.getCurrentPosition());  
  483.                     }  
  484.                 }  
  485.                 break;  
  486.             }  
  487.             case R.id.imageView1_next: {//下一首按钮  
  488.                 playService.next();//下一首  
  489.                 break;  
  490.             }  
  491.             case R.id.imageView3_previous: {//上一首按钮  
  492.                 playService.prev();//上一首  
  493.                 break;  
  494.             }  
  495.             case R.id.imageView1_play_mode: {//循环模式按钮  
  496.                 //int mode = (int) imageView1_play_mode.getTag();  
  497.                 /** 
  498.                  * 以下Tosat内容,在strings.xml里,添加对应代码 
  499.                  *<string name="order_play">顺序播放</string> 
  500.                  *<string name="random_play">随机播放</string> 
  501.                  *<string name="single_play">单曲循环</string> 
  502.                  */  
  503.                 switch (playService.getPlay_mode()) {  
  504.                     case ORDER_PLAY:  
  505.                         imageView1_play_mode.setImageResource(R.mipmap.app_mode_random);  
  506.                         //imageView1_play_mode.setTag(RANDOM_PLAY);  
  507.                         playService.setPlay_mode(RANDOM_PLAY);  
  508.                         //Toast.makeText(getApplicationContext(),"随机播放",Toast.LENGTH_SHORT).show();//这句也可以  
  509.                         //Toast.makeText(PlayActivity.this, "随机播放", Toast.LENGTH_SHORT).show();//这句也可以  
  510.                         Toast.makeText(PlayActivity.this, getString(R.string.random_play), Toast.LENGTH_SHORT).show();  
  511.                         break;  
  512.                     case RANDOM_PLAY:  
  513.                         imageView1_play_mode.setImageResource(R.mipmap.app_mode_single);  
  514.                         //imageView1_play_mode.setTag(SINGLE_PLAY);  
  515.                         playService.setPlay_mode(SINGLE_PLAY);  
  516.                         //Toast.makeText(getApplicationContext(),"单曲循环",Toast.LENGTH_SHORT).show();//这句也可以  
  517.                         //Toast.makeText(PlayActivity.this, "单曲循环", Toast.LENGTH_SHORT).show();//这句也可以  
  518.                         Toast.makeText(PlayActivity.this, getString(R.string.single_play), Toast.LENGTH_SHORT).show();  
  519.                         break;  
  520.                     case SINGLE_PLAY:  
  521.                         imageView1_play_mode.setImageResource(R.mipmap.app_mode_order);  
  522.                         //imageView1_play_mode.setTag(ORDER_PLAY);  
  523.                         playService.setPlay_mode(ORDER_PLAY);  
  524.                         //Toast.makeText(getApplicationContext(),"顺序播放",Toast.LENGTH_SHORT).show();//这句也可以  
  525.                         //Toast.makeText(PlayActivity.this, "顺序播放", Toast.LENGTH_SHORT).show();//这句也可以  
  526.                         Toast.makeText(PlayActivity.this, getString(R.string.order_play), Toast.LENGTH_SHORT).show();  
  527.                         break;  
  528.                 }  
  529.                 break;  
  530.             }  
  531.             case R.id.imageView1_favorite: {//收藏按钮  //在vo.Mp3Info里  private long mp3InfoId;//在收藏音乐时用于保存原始ID  
  532.                 Mp3Info mp3Info = playService.mp3Infos.get(playService.getCurrentPosition());//查出歌曲  
  533.                 System.out.println(mp3Info);  
  534.                 try {  
  535.                     Mp3Info loveMp3Info = app.dbUtils.findFirst(Selector.from(Mp3Info.class).where("mp3InfoId","=",getId(mp3Info)));//查出歌曲,SQL语句  
  536.                     System.out.println(loveMp3Info);  
  537.                     if (loveMp3Info==null){//返回值为null,则一定需要save  
  538.                         System.out.println("不在音乐收藏数据库中 保存音乐数据 原始数据: " + mp3Info);  
  539.                         mp3Info.setMp3InfoId(mp3Info.getId());  
  540.                         mp3Info.setIsLove(1);  
  541.                         System.out.println(mp3Info);  
  542.                         app.dbUtils.save(mp3Info);//在音乐收藏数据库 保存音乐  
  543.                         System.out.println("save");  
  544.                         imageView1_favorite.setImageResource(R.mipmap.app_love_selected);  
  545.   
  546.                         //以下是:调试使用,保存以后再查一遍  
  547.                         loveMp3Info = app.dbUtils.findFirst(Selector.from(Mp3Info.class).where("mp3InfoId","=",getId(mp3Info)));//查出歌曲,SQL语句  
  548.                         System.out.println("调试使用,保存以后再查一遍 最新数据: " + loveMp3Info);  
  549.                     }else {//返回值不为null,则一定需要update  
  550.                         System.out.println("在音乐收藏数据库中 更新音乐数据 原始数据: " + loveMp3Info);  
  551.                         int isLove = loveMp3Info.getIsLove();  
  552.                         if (isLove==1){//返回值不为null,且,isLove为1时;设置isLove为0,同时显示为'未收藏'  
  553.                             loveMp3Info.setIsLove(0);  
  554.                             imageView1_favorite.setImageResource(R.mipmap.app_love_unselected);  
  555.                         }else {//返回值不为null,且,isLove为0时;设置isLove为1,同时显示为'已收藏'  
  556.                             loveMp3Info.setIsLove(1);  
  557.                             imageView1_favorite.setImageResource(R.mipmap.app_love_selected);  
  558.                         }  
  559.                         System.out.println("update");  
  560.                         app.dbUtils.update(loveMp3Info,"isLove");//更新loveMp3Info数据  
  561.   
  562.                         //以下是:调试使用,更新以后再查一遍  
  563.                         loveMp3Info = app.dbUtils.findFirst(Selector.from(Mp3Info.class).where("mp3InfoId""=", getId(mp3Info)));//查出歌曲,SQL语句  
  564.                         System.out.println("调试使用,更新以后再查一遍 最新数据: " + loveMp3Info);  
  565.                     }  
  566.                 } catch (DbException e) {  
  567.                     e.printStackTrace();  
  568.                 }  
  569.                 break;  
  570.             }  
  571.             default:  
  572.                 break;  
  573.         }  
  574.     }  
  575.   
  576.   
  577.     //加载歌词  
  578.     private void loadLRC(File lrcFile){  
  579.         StringBuffer buf = new StringBuffer(1024 * 10);  
  580.         char[] chars = new char[1024];  
  581.         try {  
  582.             BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(lrcFile)));  
  583.             int len = -1;  
  584.             while ((len = in.read(chars)) != -1){  
  585.                 buf.append(chars,0,len);  
  586.             }  
  587.             in.close();  
  588.         } catch (FileNotFoundException e) {  
  589.             e.printStackTrace();  
  590.         }catch (IOException e) {  
  591.             e.printStackTrace();  
  592.         }  
  593.         ILrcBuilder builder = new DefaultLrcBuilder();  
  594.         List<LrcRow> rows = builder.getLrcRows(buf.toString());  
  595.         lrcView.setLrc(rows);  
  596.         //加载专辑封面图片为背景的方法(实际使用,发现效果不理想)  
  597.         //long id = mp3Info.getMp3InfoId()==0?mp3Info.getId:mp3Info.getMp3InfoId();  
  598.         //Bitmap bg = MediaUtils.getArtwork(this, id ,mp3Info.getAlbumId(),false,false);  
  599.         //if(bg != null){  
  600.         //    lrcView.getBackground(new BitmapDrawable(getResources(),bg));  
  601.         //   lrcView.getBackground().setAlpha(120);  
  602.         //}  
  603.     }  
  604.   
  605. }  

activity_music_play如下:

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:padding="@dimen/activity_horizontal_margin">  
  6.       
  7.     <android.support.v4.view.ViewPager  
  8.         android:id="@+id/viewpager"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.         android:layout_alignParentStart="true"  
  12.         android:layout_gravity="center"  
  13.         android:layout_above="@+id/linearLayout3">  
  14.     </android.support.v4.view.ViewPager>  
  15.   
  16.   
  17.     <LinearLayout  
  18.         android:id="@+id/linearLayout3"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:padding="10dp"  
  22.         android:orientation="vertical"  
  23.         android:layout_alignParentBottom="true">  
  24.   
  25.         <LinearLayout  
  26.             android:id="@+id/linearLayout"  
  27.             android:layout_width="match_parent"  
  28.             android:layout_height="wrap_content"  
  29.             android:layout_marginBottom="10dp"  
  30.             android:orientation="horizontal">  
  31.   
  32.             <TextView  
  33.                 android:id="@+id/textView1_start_time"  
  34.                 android:layout_width="wrap_content"  
  35.                 android:layout_height="wrap_content"  
  36.                 android:text="00:00"  
  37.                 android:textColor="@android:color/darker_gray" />  
  38.   
  39.             <SeekBar  
  40.                 android:id="@+id/seekBar1"  
  41.                 android:layout_width="235dp"  
  42.                 android:layout_height="wrap_content"  
  43.                 android:indeterminate="false"/>  
  44.   
  45.             <TextView  
  46.                 android:id="@+id/textView1_end_time"  
  47.                 android:layout_width="wrap_content"  
  48.                 android:layout_height="wrap_content"  
  49.                 android:text="00:00"  
  50.                 android:textColor="@android:color/darker_gray" />  
  51.   
  52.         </LinearLayout>  
  53.   
  54.         <RelativeLayout  
  55.             android:id="@+id/linearLayout2"  
  56.             android:layout_width="match_parent"  
  57.             android:layout_height="50dp"  
  58.             android:layout_marginBottom="10dp"  
  59.             android:orientation="horizontal">  
  60.   
  61.             <ImageView  
  62.                 android:id="@+id/imageView1_play_mode"  
  63.                 android:layout_width="wrap_content"  
  64.                 android:layout_height="wrap_content"  
  65.                 android:src="@mipmap/app_music_order"  
  66.                 android:layout_alignBottom="@+id/imageView3_previous"  
  67.                 android:layout_alignParentStart="true" />  
  68.   
  69.             <ImageView  
  70.                 android:id="@+id/imageView1_favorite"  
  71.                 android:layout_width="40dp"  
  72.                 android:layout_height="40dp"  
  73.                 android:src="@mipmap/app_love_unselected"  
  74.                 android:layout_alignParentTop="true"  
  75.                 android:layout_toEndOf="@+id/imageView1_play_mode"  
  76.                 android:layout_marginTop="15dp"  
  77.                 android:layout_marginStart="50dp" />  
  78.   
  79.             <ImageView  
  80.                 android:id="@+id/imageView3_previous"  
  81.                 android:layout_width="50dp"  
  82.                 android:layout_height="50dp"  
  83.                 android:layout_alignTop="@+id/imageView2_play_pause"  
  84.                 android:layout_toLeftOf="@+id/imageView2_play_pause"  
  85.                 android:src="@mipmap/app_music_previous" />  
  86.   
  87.             <ImageView  
  88.                 android:id="@+id/imageView2_play_pause"  
  89.                 android:layout_width="50dp"  
  90.                 android:layout_height="50dp"  
  91.                 android:layout_alignTop="@+id/imageView1_next"  
  92.                 android:layout_toLeftOf="@+id/imageView1_next"  
  93.                 android:src="@mipmap/app_music_play" />  
  94.   
  95.             <ImageView  
  96.                 android:id="@+id/imageView1_next"  
  97.                 android:layout_width="50dp"  
  98.                 android:layout_height="50dp"  
  99.                 android:layout_alignParentBottom="true"  
  100.                 android:layout_alignParentRight="true"  
  101.                 android:src="@mipmap/app_music_next" />  
  102.   
  103.         </RelativeLayout>  
  104.   
  105.     </LinearLayout>  
  106.   
  107. </RelativeLayout>  

ViewPagerAdapter如下:

[java]  view plain  copy
  1. package com.iwanghang.drmplayer.adapter;  
  2.   
  3. import android.content.Context;  
  4. import android.os.Parcelable;  
  5. import android.support.v4.view.PagerAdapter;  
  6. import android.support.v4.view.ViewPager;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.ImageView;  
  10. import android.widget.TextView;  
  11.   
  12. import java.util.List;  
  13.   
  14. /** 
  15.  * Created by iwanghang on 16/5/10. 
  16.  * ViewPagerAdapter 
  17.  */  
  18. public class ViewPagerAdapter extends PagerAdapter {  
  19.     private List<View> list;  
  20.     private Context context;  
  21.   
  22.     public ViewPagerAdapter(List<View> list) {  
  23.         this.list = list;  
  24.     }  
  25.   
  26.     public ViewPagerAdapter(List<View> list,Context context) {  
  27.         this.list = list;  
  28.         this.context = context;  
  29.     }  
  30.   
  31.     @Override  
  32.     public int getCount() {  
  33.         if (list != null && list.size() > 0) {  
  34.             return list.size();  
  35.         } else {  
  36.             return 0;  
  37.         }  
  38.     }  
  39.   
  40.     @Override  
  41.     public boolean isViewFromObject(View arg0, Object arg1) {  
  42.         return arg0 == arg1;  
  43.     }  
  44.   
  45.     @Override  
  46.     public void destroyItem(ViewGroup container, int position, Object object) {  
  47.         container.removeView((View) object);  
  48.     }  
  49.   
  50.     @Override  
  51.     public Object instantiateItem(ViewGroup container, int position) {  
  52.         container.addView(list.get(position));  
  53.         return list.get(position);  
  54.     }  
  55.   
  56.     @Override  
  57.     public int getItemPosition(Object object) {  
  58.         return POSITION_NONE;  
  59.     }  
  60.   
  61.   
  62.   
  63.   
  64.   
  65.   
  66.   
  67. }  
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值