编程音乐播放器 A-B 重复
Programming Music Player A-B repeat
我正在尝试为我的媒体播放器编写 A-B 重复功能。我已经尝试过带有条件 if 语句的 Runnable 函数,当它到达 B 标记时,它将通过使用 mediaplayer.getCurrentPosition() 函数保存音频流中的位置返回到开始标记。我还尝试了一个 while 循环,它在应用程序冻结时也产生了不令人满意的结果。这是我为此类方法准备的当前代码。
public void aButton() {
start = mediaPlayer.getCurrentPosition();
}
public void bButton() {
pressedCount += 1;
System.out.println("AB Button Count: " + pressedCount);
stop = mediaPlayer.getCurrentPosition();
mediaPlayer.seekTo(start);
if(mediaPlayer.getCurrentPosition() == stop){
mediaPlayer.seekTo(start);
}
}
我最终解决了我自己的问题 我决定在我的程序中编写一个带有处理程序的可运行函数来适应 while 循环,而无需进行异常处理。我为音频流中的 a 和 b 拼接位置设置了计数器。我使用计数器 aCount += 1; 和 bCount += 1 确保两个按钮只被按下一次。如果它们都被按下,程序会将控制传递给每 100 毫秒检查一次 getCurrentPosition() 的 Runnable 函数,如果流处于或超过停止位置(在 B 按钮方法的开头定义),它将寻求( ) A按钮方法开头定义的开始位置。然后,我设置了在多次按下任一按钮时恢复正常播放的方法。
这是显示我对代码所做更改的代码:
public void aButton() {
start = mediaPlayer.getCurrentPosition();
if (aCount > 1 && bCount == 1) {
aCount = 0;
bCount = 0;
}
aCount += 1;
}
public void bButton() {
stop = mediaPlayer.getCurrentPosition();
if (bCount > 1 && aCount >= 1) {
bCount = 0;
aCount = 0;
}
if (aCount != 1) {
Toast.makeText(this, "Please press A first", Toast.LENGTH_SHORT).show();
bCount = 0;
}
if(bCount == 0 && aCount == 1){
bCount += 1;
}
System.out.println("AB Button Count: " + bCount);
/*mediaPlayer.seekTo(start);*/
abLoopHandler.removeCallbacks(abLoop);
abLoopHandler.postDelayed(abLoop, 100);
}
private Runnable abLoop = new Runnable() {
@Override
public void run() {
if (aCount == 1 && bCount == 1) {
int currPos = mediaPlayer.getCurrentPosition();
if (currPos >= stop) {
mediaPlayer.seekTo(start);
}
abLoopHandler.postDelayed(this, 100);
}
}
};
希望这对遇到同样问题的人有所帮助!
我正在尝试为我的媒体播放器编写 A-B 重复功能。我已经尝试过带有条件 if 语句的 Runnable 函数,当它到达 B 标记时,它将通过使用 mediaplayer.getCurrentPosition() 函数保存音频流中的位置返回到开始标记。我还尝试了一个 while 循环,它在应用程序冻结时也产生了不令人满意的结果。这是我为此类方法准备的当前代码。
public void aButton() {
start = mediaPlayer.getCurrentPosition();
}
public void bButton() {
pressedCount += 1;
System.out.println("AB Button Count: " + pressedCount);
stop = mediaPlayer.getCurrentPosition();
mediaPlayer.seekTo(start);
if(mediaPlayer.getCurrentPosition() == stop){
mediaPlayer.seekTo(start);
}
}
我最终解决了我自己的问题 我决定在我的程序中编写一个带有处理程序的可运行函数来适应 while 循环,而无需进行异常处理。我为音频流中的 a 和 b 拼接位置设置了计数器。我使用计数器 aCount += 1; 和 bCount += 1 确保两个按钮只被按下一次。如果它们都被按下,程序会将控制传递给每 100 毫秒检查一次 getCurrentPosition() 的 Runnable 函数,如果流处于或超过停止位置(在 B 按钮方法的开头定义),它将寻求( ) A按钮方法开头定义的开始位置。然后,我设置了在多次按下任一按钮时恢复正常播放的方法。
这是显示我对代码所做更改的代码:
public void aButton() {
start = mediaPlayer.getCurrentPosition();
if (aCount > 1 && bCount == 1) {
aCount = 0;
bCount = 0;
}
aCount += 1;
}
public void bButton() {
stop = mediaPlayer.getCurrentPosition();
if (bCount > 1 && aCount >= 1) {
bCount = 0;
aCount = 0;
}
if (aCount != 1) {
Toast.makeText(this, "Please press A first", Toast.LENGTH_SHORT).show();
bCount = 0;
}
if(bCount == 0 && aCount == 1){
bCount += 1;
}
System.out.println("AB Button Count: " + bCount);
/*mediaPlayer.seekTo(start);*/
abLoopHandler.removeCallbacks(abLoop);
abLoopHandler.postDelayed(abLoop, 100);
}
private Runnable abLoop = new Runnable() {
@Override
public void run() {
if (aCount == 1 && bCount == 1) {
int currPos = mediaPlayer.getCurrentPosition();
if (currPos >= stop) {
mediaPlayer.seekTo(start);
}
abLoopHandler.postDelayed(this, 100);
}
}
};
希望这对遇到同样问题的人有所帮助!