【达内课程】音乐播放器4.0(播放详情页中)

2024-05-12 09:48

本文主要是介绍【达内课程】音乐播放器4.0(播放详情页中),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 效果图
  • 更新进度条
  • 上一曲、下一曲
  • 显示标题和专辑

效果图

在这里插入图片描述

更新进度条

要更新进度条,需要 PlayMusicService 中发送广播,每秒发送广播,广播中携带播放进度信息,因此在 PlayMusicService 的 onCreate 方法中开启一个线程,写在 onCreate 中保证只起一条线程

private boolean isLoop = true;/*** 当service实例创建时执行*/@Overridepublic void onCreate() {super.onCreate();//给mediaPlayer加监听......//启动工作线程,每隔1s发送一次更新进度的广播new updateProgressThread().start();}/*** 更新进度的线程* 每秒发送广播,广播中携带播放进度信息*/class updateProgressThread extends Thread{@Overridepublic void run() {while (isLoop){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//发送自定义广播if(mediaPlayer.isPlaying()){int total = mediaPlayer.getDuration();int currentPosition = mediaPlayer.getCurrentPosition();Intent intent = new Intent(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS);intent.putExtra("total",total);intent.putExtra("current",currentPosition);sendBroadcast(intent);}}}}

Activity 中修改广播接收器的代码

    private SeekBar seekBar;private TextView tv_play_music_total_time;private TextView tv_play_music_current_time;private void setViews() {......seekBar = findViewById(R.id.sk_play_music_progress);tv_play_music_total_time = findViewById(R.id.tv_play_music_total_time);tv_play_music_current_time = findViewById(R.id.tv_play_music_current_time);}/*** 注册广播接收器*/private void registMusicReceiver() {receiver = new MusicInfoBroadCastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Globalconsts.ACTION_MUSIC_STARTED);intentFilter.addAction(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS);this.registerReceiver(receiver, intentFilter);}....../*** 接收音乐信息的广播接收器*/class MusicInfoBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS)) {//获取广播中的total\currentint total = intent.getIntExtra("total", 0);int current = intent.getIntExtra("current", 0);//更新seekbarseekBar.setMax(total);seekBar.setProgress(current);String totalStr = Globalconsts.FORMAT.format(new Date(total));String currentStr = Globalconsts.FORMAT.format(new Date(current));tv_play_music_total_time.setText(totalStr);tv_play_music_current_time.setText(currentStr);} else if (action.equals(Globalconsts.ACTION_MUSIC_STARTED)) {......}}}

同时,Globalconsts 增加

    public static final SimpleDateFormat FORMAT = new SimpleDateFormat("mm:ss");//音乐开始播放 广播actionpublic static final String ACTION_MUSIC_STARTED = "ACTION_MUSIC_STARTED";

给进度条增加拖拽事件,MainActivity 中修改 bindMusicService() 中的 binder 对象为全局变量

    private PlayMusicService.MusicBinder binder;private void setListeners() {//给seekbar加监听seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (fromUser) {//由用户引起//seektobinder.seekTo(progress);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});......}

PlayMusicService 中 MusicBinder 里增加 seekTo方法

public class MusicBinder extends Binder{//定义供客户端调用的方法/*** 跳转到相应位置 继续播放/暂停*/public void seekTo(int position){mediaPlayer.seekTo(position);}......}

上一曲、下一曲

实现上一曲和下一曲,首先给三个图片(上一首,下一首,暂停图片)增加点击事件,同时在
MusicBinder 中 MusicBinder 中增加播放或暂停的方法

首先给 MusicBinder 中的 MusicBinder 中增加播放或暂停的方法

        //暂停或开始播放public void playOrPause(){if(mediaPlayer.isPlaying()){mediaPlayer.pause();}else {mediaPlayer.start();}}

Activity 给三个图片(上一首,下一首,暂停图片)增加点击事件

public class TestActivity extends AppCompatActivity implements View.OnClickListener {......private MusicApplication app;private ImageView img_pre_music;private ImageView img_pause_music;private ImageView img_next_music;private MusicModel musicModel = new MusicModel();......private void setViews() {......img_pre_music = findViewById(R.id.img_pre_music);img_pause_music = findViewById(R.id.img_pause_music);img_next_music = findViewById(R.id.img_next_music);}......private void setListeners() {......imgMusicThumb.setOnClickListener(this);img_pre_music.setOnClickListener(this);img_pause_music.setOnClickListener(this);img_next_music.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {......case R.id.img_pre_music:app.setPosition(app.getPosition() == 0 ? 0 : app.getPosition() - 1);//这里会出空指针,当前歌曲只有在点击播放后才能拿到currentmusic的信息final MusicItem music = app.getCurrentMusic();if (music.url != null) {//基本信息已经加载过//播放音乐binder.playMusic(music.url);} else {//通过songid获取基本信息musicModel.loadMusicInfoBySongId(music.id, new MusicInfoCallback() {@Overridepublic void onMusicInfoLoaded(MusicItem musicItem) {music.url = musicItem.url;music.id = musicItem.id;binder.playMusic(musicItem.url);}});}break;case R.id.img_pause_music:binder.playOrPause();break;case R.id.img_next_music:app.setPosition(app.getPosition() == app.getMusicList().size() - 1 ? 0 : app.getPosition() + 1);final MusicItem music2 = app.getCurrentMusic();if (music2.url != null) {//基本信息已经加载过//播放音乐binder.playMusic(music2.url);} else {//通过songid获取基本信息musicModel.loadMusicInfoBySongId(music2.id, new MusicInfoCallback() {@Overridepublic void onMusicInfoLoaded(MusicItem musicItem) {music2.url = musicItem.url;music2.id = musicItem.id;binder.playMusic(musicItem.url);}});}break;}}......
}

解决点击上一曲下一曲按钮时,触发listview的onclick事件,给rlPlayMusic加上onTouch事件,返回true即可

private void setListeners() {//给rlPlayMusic注册onTouch事件(触摸执行)rlPlayMusic.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {//如果返回truereturn true;//如果返回false//return false;}});......
}

显示标题和专辑

这一步很简单,在 Activity 中,广播接收器接收到开始的通知时,显示标题和专辑即可

/*** 接收音乐信息的广播接收器*/class MusicInfoBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS)) {......} else if (action.equals(Globalconsts.ACTION_MUSIC_STARTED)) {//开始播放音乐,获取当前音乐对象app = MusicApplication.getApp();MusicItem music = app.getCurrentMusic();String pic = music.albumPic;final String title = music.name;tv_play_music_title.setText(title);tv_play_music_singer.setText(music.albumName);......}}}

这篇关于【达内课程】音乐播放器4.0(播放详情页中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982283

相关文章

人工智能做音乐

0 别人做的音乐demo https://yun.baidu.com/share/link?shareid=1799925478&uk=840708891 1 为什么人工智能能做音乐? 最下面蓝色的部分是你输入的音乐。 从上图可以看出,input是一个个的点,然后通过input来相互结合生成灰色的点,经过几层的连接之后,最后的Output就是新生成的音乐,也就是黄色的点。 把黄色的点

AI与音乐:当技术与艺术发生冲突

AI在创造还是毁掉音乐? 在科技日新月异的今天,人工智能(AI)已经渗透到了我们生活的方方面面,音乐领域也不例外。然而,尽管AI为音乐创作带来了前所未有的便利,我却深感其正在毁掉音乐的本质。 首先,AI的介入使得音乐创作过程变得过于机械化。传统的音乐创作往往需要音乐家们经过长时间的思考、尝试和修改,最终才能创作出触动人心的作品。这一过程不仅体现了音乐家的才华和技艺,更蕴含了他们对生活的感悟和对

AI与音乐:共创未来还是艺术终结?

随着人工智能技术的不断进步,AI在音乐创作领域的应用已经成为了一个不可忽视的现象。最近一个月,一系列音乐大模型的推出,不仅极大地降低了普通人创作音乐的门槛,也引发了关于音乐产业未来的广泛讨论。AI是否正在创造音乐的新纪元,还是正在逐渐毁掉这一艺术形式?本文将深入探讨人工智能和音乐人的合作模式,讨论AI在音乐创作中的辅助作用,以及如何实现人机共同创作的可能性。 AI与音乐人的合作模式 在探讨

金蝶KIS商贸高级版4.0汉码盘点机使用说明书-金蝶KIS条码数据采集器,金蝶KIS盘点机PDA

1. 前言 PDA与“金蝶KIS商贸高级版”无缝对接,通过WIFI,3G/4G无线网络连接后台数据库,实时与后台数据库进行数据传输。在PDA上可以通过扫描条码完成采购收货,出库校验,销售出库,仓库盘点,库存查询的功能。扫描条码,录入数量,立即生成后台ERP中的各种单据。能大大提高工作效率,减少人工手工录单出错概率,提高仓库管理软件数据准确性。 1)        盘点机软件操作简单易上手,只要

视频批量剪辑新境界:一键转码MP4至MP3并自动删除原文件,轻松优化存储空间与播放体验

随着数字媒体的飞速发展,视频文件已成为我们生活中不可或缺的一部分。然而,大量视频文件的累积不仅占据了宝贵的存储空间,而且在某些情况下,我们更希望提取视频中的音频内容。为了满足这一需求,我们推出了全新的视频批量剪辑方案,让你轻松实现MP4到MP3的转码,并自动删除原文件,优化存储空间,提升播放体验。 首先,让我们进入“视频剪辑高手”的主页面。简洁明了的界面设计,让您一眼就能找到所需的功能板

查询课程编号以'c05'开头,被3名及以上学生选修且期末成绩的平均分高于75分的课程号、选修人数和期末成绩平均分,并按平均分降序排序

--查询课程编号以'c05'开头,被3名及以上学生选修--且期末成绩的平均分高于75分的课程号、选修人数--和期末成绩平均分,并按平均分降序排序use teachinggoselect courseno,count(studentno)as '选修人数',avg(final) as '期末平均分'from scorewhere courseno like 'c05%' and fi

查询每名学生的学号、选修课程数目、总成绩、并将查询结果存放到生成的’学生选课统计表‘中

--查询每名学生的学号、选修课程数目、总成绩、并将查询结果存放到生成的’学生选课统计表‘中use teachinggoif exists (select * from sys.objects where name='学生选课统计表')drop table 学生选课统计表select studentno,COUNT(*) as '选修课程数目',sum(final) as '总成绩' i

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期(上)第37课 - 变量的作用域与生命期(下)实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验小结 第40课 - C 语言中的宏定义实验小结 第36课 - 变量的作用域与生命期(上) #include <stdio.h>int var = 100; // 全

音乐圈的颠覆与挑战讨论

=================  最近的一个月,音乐界经历了一场前所未有的变革。一系列音乐大模型轮番上线,它们以惊人的能力,将素人生产音乐的门槛降到了最低。这一系列事件引发了关于音乐圈是否会被AI彻底颠覆的热烈讨论。然而,短暂的兴奋过后,我们不得不面对一些更深层次的问题:AI产品的版权归属问题,以及创意产业如何在AI的阴影下生存和发展。  AI音乐模型的出现,无疑为音乐创作带来了极大的便利

【课程总结】Day10:卷积网络的基本组件

前言 由于接下来的课程内容将围绕计算机视觉展开,其中接触最多的内容是卷积、卷积神经网络等…因此,本篇内容将从卷积入手,梳理理解:卷积的意义、卷积在图像处理中的作用以及卷积神经网络的概念,最后利用pytorch搭建一个神经网络。 卷积的理解 卷积其实是一个数学概念 在第一次接触到"卷积"的概念时,我与大多数人的想法类似,首先想的问题是,“卷积"到底是怎样的一个"卷”? 在网上搜索卷积的概念