使用ProgressBar实现歌曲的进度条以及歌曲总时间的获取

ProgressBar实现歌曲的进度条

实现歌曲的进度条(progressBar),也就是首先要获取你播放的这首歌的总时长,然后再设置一个变量,初始值为0,从歌曲开始播放的时候,每隔一秒就启动线程让这个值+1,直到这首歌播完。

  1. 先获取你要播放的歌曲的总时长,不过注意:只能准确的获取.mp3结尾的音频,不同音频格式的获取方式都不一样
    mp3格式音频的获取方法如下:
//获取MP3歌曲时间
				//你存放歌曲的路径
File f=new File("C:/Users/yjj/Music/Dream.mp3");
MP3File file = (MP3File) AudioFileIO.read(f);
MP3AudioHeader audioHeader = (MP3AudioHeader) file.getAudioHeader();
time = audioHeader.getTrackLength();
// 输出歌曲时间,单位为秒
System.out.println(audioHeader.getTrackLength() + "s");

2.接下来就是主要代码,启动线程实现进度条的播放。线程类Task.java代码如下:

package com.yc.thread;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;

public class Task implements Runnable{

	private ProgressBar progressBar;//进度条对象
	private Shell shell;//面板对象
	private int totalSize;//当前播放的这首歌的总时间  秒为单位
	private int size=0;//一开始为0
	
	public Task(ProgressBar progressBar,Shell shell,int time){
		this.progressBar=progressBar;
		this.shell=shell;
		this.totalSize=time;
	}
	
	@Override
	public void run() {
		System.out.println(totalSize);
		
		//当歌曲没有放完之前,就是每隔一秒size就加1
		while (size < totalSize) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			size++;
			System.out.println(size);

			// 让进度条动起来
			// 线程已启动就设置进度条  这是swt界面所以要使用线程来改,不然就会很卡
			Display.getDefault().asyncExec(new Runnable() {
				@Override
				public void run() {
					// 设置进度条的最大值与最小值
					progressBar.setMinimum(0);
					progressBar.setMaximum(100);

					//设置进度条的比列
					progressBar.setSelection((int) (size * 1.0 / totalSize * 100));
					System.out.println(size * 1.0 / totalSize * 100);
				}

			});

		}
	}

}

  1. 一般让进度条和音乐同步的实现时,也就是当你按下播放按钮,音乐开始播放,这是就让线程启动,这里使用的swt界面,关于点击播放按钮的代码如下:
		// 控制播放/暂停 点击后count++ 通过count奇偶数判断
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				count++;
				if (count % 2 != 0) {
					//获取到要播放的音乐
					AudioPlayer.player.start(as);
					/**
						启动线程   
						第一个参数:进度条对象
						第二个对象:进度条是放在哪个里面的
						第三个对象:当前播放的歌曲的总时间
					**/
					Task task = new Task(progressBar, shell, time);
					Thread th = new Thread(task);
					th.start();
				} else {
					//暂停
					AudioPlayer.player.stop(as);
				}
			}
		});

效果图如下:
在这里插入图片描述

这样就可以实现简单的歌曲的进度条。希望这篇博客对你有一定的作用,如若有问题欢迎指出来。

发布了8 篇原创文章 · 获赞 1 · 访问量 506

猜你喜欢

转载自blog.csdn.net/weixin_45003796/article/details/104411271
今日推荐