欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发简易音乐播放器

程序员文章站 2022-03-31 14:08:38
这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这...

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

效果图如下:

Android开发简易音乐播放器

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

这是代码的主要设计:

Android开发简易音乐播放器

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

Android开发简易音乐播放器

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

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

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

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

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