这里介绍一个简易的音乐播放器,供大家参考,具体内容如下
效果图如下:
但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但, *** 作却十分简单,方便理解!
这是代码的主要设计:
音乐主要存放在这一个文件中:
下面就来介绍各部分代码:
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",360); discAnimation.setDuration(20000); discAnimation.setInterpolator(new linearInterpolator()); discAnimation.setRepeatCount(ValueAnimator.INFINITE); needleAnimation = ObjectAnimator.offloat(needle,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(); }}
到此,这一个简易的音乐播放器,就完成了。
但是一个音乐播放器,至少播放的音乐不会只有一首,所以,可以考虑试做一个本地音乐播放器,读取本地的音乐!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
总结以上是内存溢出为你收集整理的Android开发简易音乐播放器全部内容,希望文章能够帮你解决Android开发简易音乐播放器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)