GIF
以上是我的音乐播放器的当前外观。
中心layout
是WaveView
,前面是简单的音符vector-drawable
。
我首先尝试根据Waveview
的进度设置SeekBar
的进度,不播放任何歌曲进行测试。而且效果很好(Seekbars当前的进度为100,即0.01
至1.00
)。
现在我要根据歌曲进度设置WaveView
的水位(水高)。
播放歌曲时,水位将从0.0f
设置为1.0f
,并显示白色音乐音符图标。
请注意,WaveView
的水位只能在0.0f
到1.0f
之间设置。
我尝试了多种方法,但无法解决此问题。
这是我的代码,应返回 0.01、0.02等……:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mainMediaPlayer != null) {
currentDurationPosition = mainMediaPlayer.getCurrentPosition()/1000;
songSeekBar.setProgress(currentDurationPosition+1);
topSongTitle.setText(songsList.get(currentSongPosition).getName());
songCircleProgress.setWaterLevelRatio(currentDurationPosition/mainMediaPLayer.getDuration());
} else {
Toast.makeText(MainActivity.this, "No song is playing now", Toast.LENGTH_SHORT).show();
}
handler.postDelayed(this, 1000);
}
});
答案 0 :(得分:1)
重新阅读您的代码后,我认为我在这里看到两个问题:
首先,您的staticFloat
初始化:
private static float staticFloat = 1/100;
这样做,您实际上是在进行整数除法,然后将其转换为浮点数。 1/100的整数除数等于0,因此您的浮点数将始终为0.0f。 要获得0.01值,您需要做
private static float staticFloat = 1/100f; // or 1f/100
通过这种方式,您可以将int除以浮点数(或相反),它将得到一个浮点结果。
第二,您的getWaterPosition
函数。当进度为0时,您将返回0。在其他所有情况下,您也将返回0。
为什么?您要返回每种情况
returnPosition = minusPosition - (minusPosition - staticFloat);
等效于:
returnPosition = minusPosition - minusPosition + staticFloat;
再次等同于:
returnPosition = staticFloat;
并且正如我们之前所看到的,当您修复它时,它总是0,甚至0.01f。
我猜想您在使用该公式时犯了一些错误。但是仅做类似return progress / 100f;
的事情就行不通吗?
您也可以在xml中向搜索栏添加一个最大值,因此该值永远不会超过100,并且您的回报将介于0.0f和1.0f之间
<SeekBar
// initialisation
android:max="100"/>