项目演示(视频中会出现黑屏是手机录像输入密码时防止密码泄露而导致的,并不是程序问题)
video02
登录注册代码和页面在上一篇文章,地址为:http://t.csdnimg.cn/sgdba
在res目录下新建一个文件夹raw,然后自己将准备好的音频文件复制粘贴到raw文件夹下 activity_music.xml布局文件
实现代码MusciActivity.java 代码上都有注解解释代码,不懂的自行查阅
import android.media.MediaPlayer; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import java.io.IOException; public class MusicActivity extends AppCompatActivity implements View.OnClickListener { private static final int VOICE_RECOGNITION_REQUEST_CODE = 100; private ImageView img; private ImageView img_start; private ImageView img_after; private ImageView img_before; private ImageView img_end; private LinearLayout layout; private RotateAnimation rotateAnimation = null; private LinearInterpolator linearInterpolator = null; private MediaPlayer player; private TextView tv_alltime; private TextView tv_starttime; private android.widget.SeekBar seekbar; private final int updata = 1; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { setStatusColor(R.color.transparent); super.onCreate(savedInstanceState); setContentView(R.layout.activity_music); initView(); try { InitAndio(); } catch (IOException e) { throw new RuntimeException(e); } seekbar.setProgress(0); setMusicData(); ViewClick(); } private void setMusicData() { // 设置进度条的监听 seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { // 进度条改变时调用 @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { if (!player.isPlaying()) { player.seekTo(seekbar.getProgress()); tv_starttime.setText(new Vedio().JinDuTime(seekbar.getProgress() / 1000)); } } // 开始拉动进度条时调用 @Override public void onStartTrackingTouch(SeekBar seekBar) { handler.removeMessages(updata); //player.stop(); player.pause(); } // 停止拉动进度条时调用 @Override public void onStopTrackingTouch(SeekBar seekBar) { handler.sendEmptyMessage(updata); player.start(); } }); handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message message) { switch (message.what) { case updata: { // 设置进度条的最大值 seekbar.setMax(player.getDuration()); // 设置当前进度条长度(即监听得到的时间) seekbar.setProgress(player.getCurrentPosition()); // 设置当前音乐播放的位置 tv_starttime.setText(new Vedio().JinDuTime(player.getCurrentPosition() / 1000)); // 每隔1000毫秒刷新一次进度条的值 handler.sendEmptyMessageDelayed(updata, 1000); } } return true; } }); } /** * 设置状态栏颜色 */ public void setStatusColor(int color) { if (Build.VERSION.SDK_INT >= 21) { View view = MusicActivity.this.getWindow().getDecorView(); view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); MusicActivity.this.getWindow().setStatusBarColor(MusicActivity.this.getResources().getColor(color)); } } /** * 初始化控件 */ public void initView() { img_start = findViewById(R.id.img_start); img_after = findViewById(R.id.img_after); img_before = findViewById(R.id.img_before); img_end = findViewById(R.id.img_end); layout = findViewById(R.id.layout); tv_alltime = findViewById(R.id.tv_alltime); tv_starttime = findViewById(R.id.tv_starttime); seekbar = findViewById(R.id.seekbar); } /** * 控件点击事件 */ public void ViewClick() { img_start.setOnClickListener(this); img_before.setOnClickListener(this); img_after.setOnClickListener(this); img_end.setOnClickListener(this); } /** * 初始化音频数据 */ public void InitAndio() throws IOException { player = new MediaPlayer(); // 获取音频文件 player = MediaPlayer.create(getApplicationContext(), R.raw.music01); // 获取音频的总时间 int time = player.getDuration() / 1000; tv_alltime.setText(new Vedio().JinDuTime(time)); } @Override public void onClick(View view) { if (view.getId() == R.id.img_start) { // 开始播放按钮 // 点击开始播放按钮并隐藏,img_end显示 img_start.setVisibility(View.GONE); img_end.setVisibility(View.VISIBLE); // 开始音乐播放 player.start(); // 添加监听 handler.sendEmptyMessage(updata); } else if (view.getId() == R.id.img_after) { Toast.makeText(this, "下一曲", Toast.LENGTH_SHORT).show(); } else if (view.getId() == R.id.img_before) { Toast.makeText(this, "上一曲", Toast.LENGTH_SHORT).show(); } else if (view.getId() == R.id.img_end) { // 暂停音乐播放 player.pause(); // 点击暂停按钮并隐藏,img_start显示 img_end.setVisibility(View.GONE); img_start.setVisibility(View.VISIBLE); // 移除监听 handler.removeMessages(updata); } } }
时间换算工具类 Video.java
import java.io.Serializable; public class Vedio { public String JinDuTime(int time){ int miao=time%60; int fen=time/60; int shi=time/60/60; Serializable getfen = fen < 10 ? 0 + "" + fen : fen; Serializable getmiao = miao < 10 ? 0 + "" + miao : miao; return getfen+":"+getmiao; } }
至此简易音乐播放器就已完成了,更多功能待你扩展,代码只是提供参考,希望你能从中获取有用的技术价值