1. 程式人生 > 程式設計 >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",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();
 }
}

到此,這一個簡易的音樂播放器,就完成了。

但是一個音樂播放器,至少播放的音樂不會只有一首,所以,可以考慮試做一個本地音樂播放器,讀取本地的音樂!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。