当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发简易音乐播放器

Android开发简易音乐播放器

2020年03月09日  | 移动技术网IT编程  | 我要评论

自由恋爱的时代,关之琳吻戏,黄炳馀

这里介绍一个简易的音乐播放器,供大家参考,具体内容如下

效果图如下:

但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解!

这是代码的主要设计:

音乐主要存放在这一个文件中:

下面就来介绍各部分代码:

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();
 }
}

到此,这一个简易的音乐播放器,就完成了。

但是一个音乐播放器,至少播放的音乐不会只有一首,所以,可以考虑试做一个本地音乐播放器,读取本地的音乐!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网