Android开发简易音乐播放器
程序员文章站
2022-03-31 14:08:38
这里介绍一个简易的音乐播放器,供大家参考,具体内容如下
效果图如下:
但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解!
这...
这里介绍一个简易的音乐播放器,供大家参考,具体内容如下
效果图如下:
但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解!
这是代码的主要设计:
音乐主要存放在这一个文件中:
下面就来介绍各部分代码:
activity—main。xml:
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#696969"> <linearlayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_margintop="10dp" android:layout_alignparenttop="true" android:id="@+id/title" android:orientation="horizontal"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margintop="15dp" android:layout_marginbottom="3dp" android:text="生僻字" android:textsize="25dp" android:gravity="center" android:textcolor="#ffffff"/> </linearlayout> <textview android:layout_width="match_parent" android:layout_height="0.5dp" android:background="#afafaf" android:layout_below="@+id/title"/> <imageview android:id="@+id/disc" android:layout_width="280dp" android:layout_height="280dp" android:layout_centerhorizontal="true" android:layout_below="@+id/title" android:layout_margintop="50dp" android:src="@drawable/xcvb" /> <imageview android:id="@+id/needle" android:layout_width="120dp" android:layout_height="120dp" android:layout_below="@+id/title" android:layout_marginleft="150dp"/> <relativelayout android:id="@+id/music1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/rl" android:layout_margintop="20dp" android:layout_marginbottom="10dp" android:gravity="center"> <seekbar android:id="@+id/music_seek_bar" android:layout_width="240dp" android:layout_height="wrap_content"/> <textswitcher android:id="@+id/text_switcher" android:layout_width="80dp" android:layout_height="50dp" android:layout_torightof="@+id/music_seek_bar"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:text="00:00/2:00" android:textcolor="@color/coloraccent"/> </textswitcher> </relativelayout> <linearlayout android:layout_width="match_parent" android:layout_height="70dp" android:gravity="center" android:id="@+id/rl" android:layout_marginbottom="20dp" android:layout_alignparentbottom="true" android:orientation="horizontal"> <imageview android:id="@+id/playing_pre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/music_previous" /> <imageview android:id="@+id/playing_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/music_play" /> <imageview android:id="@+id/playing_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@drawable/music_next" /> </linearlayout> </relativelayout>
main。activity部分:
package com.example.cungu.musicdemo; import android.animation.objectanimator; import android.animation.valueanimator; import android.content.componentname; import android.content.intent; import android.content.serviceconnection; import android.graphics.bitmap; import android.graphics.color; import android.os.build; import android.os.ibinder; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.view.window; import android.view.windowmanager; import android.view.animation.linearinterpolator; import android.widget.button; import android.widget.imageview; import android.widget.seekbar; import android.widget.textswitcher; import java.text.simpledateformat; import java.util.date; public class mainactivity extends appcompatactivity implements view.onclicklistener, runnable, serviceconnection, seekbar.onseekbarchangelistener { private imageview disc,needle,playingpre,playingplay,playingnext; private objectanimator discanimation,needleanimation;//自定义指针和唱盘 private boolean isplaying = true;//0,1 判断是否处于播放状态 //声明服务 private static final string tag = mainactivity.class.getsimplename(); private mediaservice.musiccontroller mmusiccontroller; //使用方法:mmusiccontroller.play();播放 mmusiccontroller.pause();暂停 private boolean running; private textswitcher mswitcher; private seekbar mseekbar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //设置透明栏 if(build.version.sdk_int >= build.version_codes.lollipop) { window window = getwindow(); window.clearflags(windowmanager.layoutparams.flag_translucent_status | windowmanager.layoutparams.flag_translucent_navigation); window.getdecorview().setsystemuivisibility( view.system_ui_flag_layout_fullscreen | view.system_ui_flag_layout_stable ); window.addflags(windowmanager.layoutparams.flag_draws_system_bar_backgrounds); window.setstatusbarcolor(color.transparent); } //滑动条部分 mseekbar = (seekbar) findviewbyid(r.id.music_seek_bar); mseekbar.setonseekbarchangelistener(this); mswitcher = (textswitcher) findviewbyid(r.id.text_switcher); mswitcher.setinanimation(this, android.r.anim.fade_in); mswitcher.setoutanimation(this, android.r.anim.fade_out); intent intent = new intent(this, mediaservice.class); //增加startservice,来增加后台播放功能 startservice(intent); // 绑定服务,使用context来绑定 // 那个界面需要绑定 就用哪个 activity // 参数1:intent 代表需要绑定哪一个service // 参数2:serviceconnection 回调接口,可以接收到service连接成功和断开的回调,成功就可以取到对象。 // 绑定服务 参数2就是服务和指定的对象绑定在一起 bindservice(intent, this, bind_auto_create); //指针和唱片部分 initviews();//定义背景图 setanimations(); } private void initviews() { playingpre = (imageview) findviewbyid(r.id.playing_pre); playingplay = (imageview) findviewbyid(r.id.playing_play); playingnext = (imageview) findviewbyid(r.id.playing_next); disc = (imageview) findviewbyid(r.id.disc); needle = (imageview) findviewbyid(r.id.needle); playingpre.setonclicklistener(this); playingplay.setonclicklistener(this); playingnext.setonclicklistener(this); } //动画设置 private void setanimations() { discanimation = objectanimator.offloat(disc, "rotation", 0, 360); discanimation.setduration(20000); discanimation.setinterpolator(new linearinterpolator()); discanimation.setrepeatcount(valueanimator.infinite); needleanimation = objectanimator.offloat(needle, "rotation", 0, 25); needle.setpivotx(0); needle.setpivoty(0); needleanimation.setduration(800); needleanimation.setinterpolator(new linearinterpolator()); } @override public void onclick(view v) { int id = v.getid(); switch (id) { case r.id.playing_pre://前一曲 if (discanimation != null) { discanimation.end(); playing(); } break; case r.id.playing_play://播放中 if (isplaying){ playing(); }else { if (needleanimation != null) { needleanimation.reverse(); needleanimation.end(); mmusiccontroller.pause(); } if (discanimation != null && discanimation.isrunning()) { discanimation.cancel(); mmusiccontroller.pause(); float valueavatar = (float) discanimation.getanimatedvalue(); discanimation.setfloatvalues(valueavatar, 360f + valueavatar); } playingplay.setimageresource(r.drawable.music_play); isplaying = true; } break; case r.id.playing_next://下一曲 if (discanimation != null) { discanimation.end(); playing(); } break; default: break; } } //播放:1、播放音乐 2、动画旋转 3、暂停图片切换为播放按钮图片 private void playing(){ needleanimation.start(); discanimation.start(); playingplay.setimageresource(r.drawable.music_pause); mmusiccontroller.play();//播放 isplaying = false; } //===================================播放歌曲服务开启、停止、结束=============================== @override protected void onstart() { super.onstart(); thread thread = new thread(this); thread.start(); } @override protected void onstop() { running = false; super.onstop(); } @override protected void ondestroy() { // 解除绑定 unbindservice(this); super.ondestroy(); } //---------------------播放到当前音乐的滑动条及时间设置-------------------------- @override public void run() { running = true; try { while (running) { if (mmusiccontroller != null) { long musicduration = mmusiccontroller.getmusicduration(); final long position = mmusiccontroller.getposition(); final date datetotal = new date(musicduration); final simpledateformat sb = new simpledateformat("mm:ss"); mseekbar.setmax((int) musicduration); mseekbar.setprogress((int) position); mswitcher.post( new runnable() { @override public void run() { date date = new date(position); string time = sb.format(date) + "/" + sb.format(datetotal); mswitcher.setcurrenttext(time); } } ); } thread.sleep(500); } } catch (interruptedexception e) { e.printstacktrace(); } } //----------------------------- //服务绑定与解除绑定的回调 /** * 当服务与当前绑定对象,绑定成功,服务onbind方法调用并且返回之后 * 回调给这个方法 * * @param name * @param service ibinder 就是服务 onbind 返回的对象 */ @override public void onserviceconnected(componentname name, ibinder service) { mmusiccontroller = ((mediaservice.musiccontroller) service); } @override public void onservicedisconnected(componentname name) { mmusiccontroller = null; } public void btnstopservice(view view) { intent intent = new intent(this, mediaservice.class); stopservice(intent); } @override public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { } @override public void onstarttrackingtouch(seekbar seekbar) { } @override public void onstoptrackingtouch(seekbar seekbar) { mmusiccontroller.setposition(seekbar.getprogress()); } }
mediaserver部分的代码:
package com.example.cungu.musicdemo; import android.app.service; import android.content.intent; import android.media.mediaplayer; import android.os.binder; import android.os.environment; import android.os.ibinder; public class mediaservice extends service { private mediaplayer mplayer; /* 绑定服务的实现流程: * 1.服务 oncreate, onbind, ondestroy 方法 * 2.onbind 方法需要返回一个 ibinder 对象 * 3.如果 activity 绑定,activity 就可以取到 ibinder 对象,可以直接调用对象的方法 */ // 相同应用内部不同组件绑定,可以使用内部类以及binder对象来返回。 public class musiccontroller extends binder { public void play() { mplayer.start();//开启音乐 } public void pause() { mplayer.pause();//暂停音乐 } public long getmusicduration() { return mplayer.getduration();//获取文件的总长度 } public long getposition() { return mplayer.getcurrentposition();//获取当前播放进度 } public void setposition (int position) { mplayer.seekto(position);//重新设定播放进度 } } /** * 当绑定服务的时候,自动回调这个方法 * 返回的对象可以直接操作service内部的内容 * @param intent * @return */ @override public ibinder onbind(intent intent) { return new musiccontroller(); } @override public void oncreate() { super.oncreate(); mplayer = mediaplayer.create(this, r.raw.yinyue1); } /** * 任意一次unbindservice()方法,都会触发这个方法 * 用于释放一些绑定时使用的资源 * @param intent * @return */ @override public boolean onunbind(intent intent) { return super.onunbind(intent); } @override public void ondestroy() { if (mplayer.isplaying()) { mplayer.stop(); } mplayer.release(); mplayer = null; super.ondestroy(); } }
到此,这一个简易的音乐播放器,就完成了。
但是一个音乐播放器,至少播放的音乐不会只有一首,所以,可以考虑试做一个本地音乐播放器,读取本地的音乐!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Vue实现图片与文字混输效果