此次音乐播放器是针对上一个:https://blog.csdn.net/qq_43433255/article/details/88084420
开发出来的一个功能增强型,基本实现功能为:
mainactivity.java的代码:
package com.example.shaoyangyang.shaoshuaih;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.DialogInterface;
import android.media.Image;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.example.shaoyangyang.shaoshuaih.adapter.MusicPagerAdapter;
import com.example.shaoyangyang.shaoshuaih.fragment.LogicFragment;
import com.example.shaoyangyang.shaoshuaih.fragment.OnlineFragment;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
//实现OnClickListener的接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//定义activity_main.xml的控件对象
private TextView logicTv;
private TextView onlineTv;
private ViewPager viewPager;
private ImageView menuImagv;
private ImageView seachImagv;
private Calendar calendar;
//将Fragment放入List集合中,存放fragment对象
private List fragmentList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定id
bangdingID();
//设置监听
jianting();
//创建fragment对象
LogicFragment logicFragment = new LogicFragment();
OnlineFragment onlineFragment = new OnlineFragment();
//将fragment对象添加到fragmentList中
fragmentList.add(logicFragment);
fragmentList.add(onlineFragment);
//通过MusicPagerAdapter类创建musicPagerAdapter的适配器,下面我将添加MusicPagerAdapter类的创建方法
MusicPagerAdapter musicPagerAdapter = new MusicPagerAdapter(getSupportFragmentManager(), fragmentList);
//viewPager绑定适配器
viewPager.setAdapter(musicPagerAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
logicTv.setTextColor(getResources().getColor(R.color.white));
onlineTv.setTextColor(getResources().getColor(R.color.white_60P));
break;
case 1:
onlineTv.setTextColor(getResources().getColor(R.color.white));
logicTv.setTextColor(getResources().getColor(R.color.white_60P));
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void jianting() {
logicTv.setOnClickListener(this);
onlineTv.setOnClickListener(this);
menuImagv.setOnClickListener(this);
seachImagv.setOnClickListener(this);
}
private void bangdingID() {
logicTv = findViewById(R.id.main_logic_tv);
onlineTv = findViewById(R.id.main_online_tv);
viewPager = findViewById(R.id.main_vp);
menuImagv = findViewById(R.id.main_menu_imgv);
seachImagv = findViewById(R.id.main_search_imgv);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_logic_tv:
//实现点击TextView切换fragment
viewPager.setCurrentItem(0);
break;
case R.id.main_online_tv:
viewPager.setCurrentItem(1);
break;
case R.id.main_menu_imgv:
calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Toast.makeText(MainActivity.this, "所选择的日期是:" + year + "-" + (month + 1) + "-" + dayOfMonth, Toast.LENGTH_SHORT).show();
}
}, year, month, day);
datePickerDialog.show();
break;
case R.id.main_search_imgv:
calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(MainActivity.this, "所选择的时间是:" + hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();
}
}, hour, minute, true);
timePickerDialog.show();
break;
default:
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) {
final View view = LayoutInflater.from(this).inflate(R.layout.dialog1_layout, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("退出提示");
builder.setView(view);
builder.setPositiveButton("能", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("不能", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "且看曼城分分 钟打你脸", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
return super.onKeyDown(keyCode, event);
}
}
musicactivity。java的代码:
package com.example.shaoyangyang.shaoshuaih;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.shaoyangyang.shaoshuaih.entity.Music;
import com.example.shaoyangyang.shaoshuaih.utils.BlurUtil;
import com.example.shaoyangyang.shaoshuaih.utils.Common;
import com.example.shaoyangyang.shaoshuaih.utils.MergeImage;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MusicActivity extends AppCompatActivity implements View.OnClickListener {
//定义activity_music.xml的控件对象
//设置音乐播放模式
private int i = 0;
private int playMode = 0;
private int buttonWitch = 0;
private ImageView bgImgv;
private TextView titleTv;
private TextView artistTv;
private TextView currrentTv;
private TextView totalTv;
private ImageView prevImgv;
private ImageView nextImgv;
private int position;
private ImageView discImagv;
private ImageView needleImagv;
private MediaPlayer mediaPlayer;
private ImageView pauseImgv;
private ImageView downImg;
private ImageView styleImg;
private SeekBar seekBar;
private int totaltime;
private boolean isStop;
private ObjectAnimator objectAnimator = null;
private RotateAnimation rotateAnimation = null;
private RotateAnimation rotateAnimation2 = null;
private String TAG = "MusicActivity";
//Handler实现向主线程进行传值
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
seekBar.setProgress((int) (msg.what));
currrentTv.setText(formatTime(msg.what));
}
};
//MusicActivity onCreate()方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
bingID(); //调用bingID();方法实现对控件的绑定
Intent intent = getIntent(); //通过getIntent()方法实现intent信息的获取
position = intent.getIntExtra("position", 0); //获取position
mediaPlayer = new MediaPlayer();
prevAndnextplaying(Common.musicList.get(position).path);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { //seekbar设置监听,实现指哪放到哪
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
//prevAndnext() 实现页面的展现
private void prevAndnextplaying(String path) {
isStop = false;
mediaPlayer.reset();
titleTv.setText(Common.musicList.get(position).title);
artistTv.setText(Common.musicList.get(position).artist + "--" + Common.musicList.get(position).album);
pauseImgv.setImageResource(R.mipmap.ic_play_btn_pause);
if (Common.musicList.get(position).albumBip != null) {
Bitmap bgbm = BlurUtil.doBlur(Common.musicList.get(position).albumBip, 10, 5);//将专辑虚化
bgImgv.setImageBitmap(bgbm); //设置虚化后的专辑图片为背景
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.play_page_disc);//BitmapFactory.decodeResource用于根据给定的资源ID从指定的资源文件中解析、创建Bitmap对象。
Bitmap bm = MergeImage.mergeThumbnailBitmap(bitmap1, Common.musicList.get(position).albumBip);//将专辑图片放到圆盘中
discImagv.setImageBitmap(bm);
} else {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.touxiang1);
bgImgv.setImageBitmap(bitmap);
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.play_page_disc);
Bitmap bm = MergeImage.mergeThumbnailBitmap(bitmap1, bitmap);
discImagv.setImageBitmap(bm);
}
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepare(); // 准备
mediaPlayer.start(); // 启动
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onCompletion(MediaPlayer mp) {
if(!mediaPlayer.isPlaying()){
setPlayMode();
}
}
});
} catch (IllegalArgumentException | SecurityException | IllegalStateException
| IOException e) {
e.printStackTrace();
}
totalTv.setText(formatTime(Common.musicList.get(position).length));
seekBar.setMax(Common.musicList.get(position).length);
MusicThread musicThread = new MusicThread(); //启动线程
new Thread(musicThread).start();
//实例化,设置旋转对象
objectAnimator = ObjectAnimator.ofFloat(discImagv, "rotation", 0f, 360f);
//设置转一圈要多长时间
objectAnimator.setDuration(8000);
//设置旋转速率
objectAnimator.setInterpolator(new LinearInterpolator());
//设置循环次数 -1为一直循环
objectAnimator.setRepeatCount(-1);
//设置转一圈后怎么转
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
objectAnimator.start();
rotateAnimation = new RotateAnimation(-25f, 0f, Animation.RELATIVE_TO_SELF, 0.3f, Animation.RELATIVE_TO_SELF, 0.1f);
rotateAnimation.setDuration(500);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setRepeatCount(0);
rotateAnimation.setFillAfter(true);
rotateAnimation.setStartOffset(500);
needleImagv.setAnimation(rotateAnimation);
rotateAnimation.cancel();
rotateAnimation2 = new RotateAnimation(0f, -25f, Animation.RELATIVE_TO_SELF, 0.3f, Animation.RELATIVE_TO_SELF, 0.1f);
rotateAnimation2.setDuration(500);
rotateAnimation2.setInterpolator(new LinearInterpolator());
rotateAnimation2.setRepeatCount(0);
rotateAnimation2.setFillAfter(true);
needleImagv.setAnimation(rotateAnimation2);
rotateAnimation2.cancel();
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void setPlayMode() {
if (playMode == 0)//全部循环
{
if (position == Common.musicList.size() - 1)//默认循环播放
{
position = 0;// 第一首
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
} else {
position++;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
} else if (playMode == 1)//单曲循环
{
//position不需要更改
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
} else if (playMode == 2)//随机
{
position = (int) (Math.random() * Common.musicList.size());//随机播放
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setBtnMode() {
if (playMode == 0)//全部循环
{
if (position == Common.musicList.size() - 1)//默认循环播放
{
if (buttonWitch == 1) {
position--;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
} else if (buttonWitch == 2) {
position = 0;// 第一首
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
} else if (position == 0) {
if (buttonWitch == 1) {
position = Common.musicList.size() - 1;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
} else if (buttonWitch == 2) {
position++;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
}else {
if(buttonWitch ==1){
position--;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}else if(buttonWitch ==2){
position++;
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
}
} else if (playMode == 1)//单曲循环
{
//position不需要更改
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
} else if (playMode == 2)//随机
{
position = (int) (Math.random() * Common.musicList.size());//随机播放
mediaPlayer.reset();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
prevAndnextplaying(Common.musicList.get(position).path);
}
}
//格式化数字
private String formatTime(int length) {
Date date = new Date(length);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss"); //规定固定的格式
String totaltime = simpleDateFormat.format(date);
return totaltime;
}
//绑定id,设置监听
private void bingID() {
titleTv = findViewById(R.id.music_title_tv);
artistTv = findViewById(R.id.music_artist_tv);
bgImgv = findViewById(R.id.music_bg_imgv);
currrentTv = findViewById(R.id.music_current_tv);
totalTv = findViewById(R.id.music_total_tv);
prevImgv = findViewById(R.id.music_prev_imgv);
nextImgv = findViewById(R.id.music_next_imgv);
discImagv = findViewById(R.id.music_disc_imagv);
needleImagv = findViewById(R.id.music_needle_imag);
pauseImgv = findViewById(R.id.music_pause_imgv);
downImg = findViewById(R.id.music_down_imgv);
seekBar = findViewById(R.id.music_seekbar);
styleImg = findViewById(R.id.music_play_btn_loop_img);
pauseImgv.setOnClickListener(this);
prevImgv.setOnClickListener(this);
nextImgv.setOnClickListener(this);
downImg.setOnClickListener(this);
styleImg.setOnClickListener(this);
}
//onClick()点击监听
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.music_prev_imgv:
buttonWitch = 1;
setBtnMode();
break;
case R.id.music_next_imgv:
buttonWitch = 2;
setBtnMode();
break;
case R.id.music_pause_imgv:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
objectAnimator.pause();
needleImagv.startAnimation(rotateAnimation2);
pauseImgv.setImageResource(R.mipmap.ic_play_btn_play);
} else {
mediaPlayer.start();
objectAnimator.resume();
needleImagv.startAnimation(rotateAnimation);
pauseImgv.setImageResource(R.mipmap.ic_play_btn_pause);
}
break;
case R.id.music_play_btn_loop_img:
i++;
if (i % 3 == 1) {
Toast.makeText(MusicActivity.this, "单曲循环", Toast.LENGTH_SHORT).show();
playMode = 1;
styleImg.setImageResource(R.mipmap.ic_play_btn_one);
}
if (i % 3 == 2) {
Toast.makeText(MusicActivity.this, "随机播放", Toast.LENGTH_SHORT).show();
playMode = 2;
styleImg.setImageResource(R.mipmap.ic_play_btn_shuffle);
}
if (i % 3 == 0) {
Toast.makeText(MusicActivity.this, "顺序播放", Toast.LENGTH_SHORT).show();
playMode = 0;
styleImg.setImageResource(R.mipmap.ic_play_btn_loop);
}
break;
case R.id.music_down_imgv:
this.finish();
break;
default:
break;
}
}
@Override
protected void onPause() {
super.onPause();
for (Music music : Common.musicList
) {
music.isPlaying = false;
}
Common.musicList.get(position).isPlaying = true;
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
i = 0;
isStop = false;
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
if (mediaPlayer != null) {
mediaPlayer.stop();
}
}
//创建一个类MusicThread实现Runnable接口,实现多线程
class MusicThread implements Runnable {
@Override
public void run() {
while (!isStop && Common.musicList.get(position) != null) {
try {
//让线程睡眠1000毫秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//放送给Handler现在的运行到的时间,进行ui更新
handler.sendEmptyMessage(mediaPlayer.getCurrentPosition());
}
}
}
}
贴上一些关键代码提供参考!