如何根据SeekBar的进度设置WaveView的波高?

时间:2018-09-25 14:51:18

标签: java android

GIF

GIF以上是我的音乐播放器的当前外观。

中心layoutWaveView,前面是简单的音符vector-drawable

我首先尝试根据Waveview的进度设置SeekBar的进度,不播放任何歌曲进行测试。而且效果很好(Seekbars当前的进度为100,即0.011.00)。

现在我要根据歌曲进度设置WaveView水位(水高)。

播放歌曲时,水位将从0.0f设置为1.0f,并显示白色音乐音符图标。

请注意WaveView的水位只能在0.0f1.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);
    }
});

1 个答案:

答案 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"/>