溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發(fā)簡易音樂播放器

發(fā)布時間:2020-08-30 17:26:13 來源:腳本之家 閱讀:241 作者:無落 欄目:移動開發(fā)

這里介紹一個簡易的音樂播放器,供大家參考,具體內(nèi)容如下

效果圖如下:

Android開發(fā)簡易音樂播放器

但是,由于這是一個簡易版的音樂播放器,所播放的音樂只有一首,且被寫死,但,操作卻十分簡單,方便理解!

這是代碼的主要設計:

Android開發(fā)簡易音樂播放器

音樂主要存放在這一個文件中:

Android開發(fā)簡易音樂播放器

下面就來介紹各部分代碼:

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 判斷是否處于播放狀態(tài)

 //聲明服務
 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
 // 參數(shù)1:Intent  代表需要綁定哪一個Service
 // 參數(shù)2:ServiceConnection 回調(diào)接口,可以接收到Service連接成功和斷開的回調(diào),成功就可以取到對象。
 // 綁定服務 參數(shù)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();
 }
 }

 //-----------------------------
 //服務綁定與解除綁定的回調(diào)

 /**
 * 當服務與當前綁定對象,綁定成功,服務onBind方法調(diào)用并且返回之后
 * 回調(diào)給這個方法
 *
 * @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;
 /* 綁定服務的實現(xiàn)流程:
 * 1.服務 onCreate, onBind, onDestroy 方法
 * 2.onBind 方法需要返回一個 IBinder 對象
 * 3.如果 Activity 綁定,Activity 就可以取到 IBinder 對象,可以直接調(diào)用對象的方法
 */
 // 相同應用內(nèi)部不同組件綁定,可以使用內(nèi)部類以及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);//重新設定播放進度
 }
 }
 /**
 * 當綁定服務的時候,自動回調(diào)這個方法
 * 返回的對象可以直接操作Service內(nèi)部的內(nèi)容
 * @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()方法,都會觸發(fā)這個方法
 * 用于釋放一些綁定時使用的資源
 * @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();
 }
}

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI