Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据SeekBar'设置WaveView的波高;有什么进展?_Java_Android - Fatal编程技术网

Java 如何根据SeekBar'设置WaveView的波高;有什么进展?

Java 如何根据SeekBar'设置WaveView的波高;有什么进展?,java,android,Java,Android,上面的GIF是我的音乐播放器的当前外观 中央布局,前面是一个简单的音符矢量可绘制 我首先尝试根据SeekBar的进度设置Waveview进度,而不播放任何歌曲来测试它。它工作得非常好(参见kbars current progress/100,即0.01到1.00) 现在我想做的是根据歌曲的进度设置WaveView的水位 播放歌曲时,水位将从0.0f设置为1.0f,并显示白色音符图标 请注意,WaveView的水位只能从0.0f设置为1.0f 我尝试了多种方法,但都没能解决这个问题 这是我的代码,

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

中央
布局
,前面是一个简单的音符
矢量可绘制

我首先尝试根据
SeekBar
的进度设置
Waveview
进度,而不播放任何歌曲来测试它。它工作得非常好(参见kbars current progress/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);
    }
});

在重新阅读您的代码后,我想我在这里看到了两个问题:

首先,您的
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。在其他任何情况下,你都会回来,嗯。。。我也是

为什么??你正在处理每一个案子

returnPosition = minusPosition - (minusPosition - staticFloat);
这相当于:

returnPosition = minusPosition - minusPosition + staticFloat;
returnPosition = staticFloat;
同样相当于:

returnPosition = minusPosition - minusPosition + staticFloat;
returnPosition = staticFloat;
正如我们之前所看到的,当你修正它时,它总是0,甚至是0.01f

我猜你在使用这个公式时犯了一些错误。但是如果只执行
returnprogress/100f这样的操作,它会不会工作

您还可以在xml中为seekbar添加一个最大值,这样它就永远不会超过100,并且您的返回值将在0.0f和1.0f之间

<SeekBar
    // initialisation
    android:max="100"/>


我不确定我是否理解了所有内容,如果你在没有这首歌的情况下成功了,那么添加这首歌有什么区别?为什么它不能像以前那样只使用progress/100?使用当前函数,除非进度>=10000@Macmist我一直都知道如何得到0.0的值。这就是我问这个问题的原因。我猜我的朋友上传了错误的代码,把事情搞得一团糟,而这些代码不是我的。对不起!这不是我一直坚持的代码。但通过你的建议,我成功地解决了这个问题。谢谢!我把原来的问题,我得到并接受你的答案!我已经提出了我面临的最初问题。我不知道我朋友从哪里得到的那套糟糕的密码。再次感谢您的关注!我已经接受了答案,它通过在这里输入f帮助我解决了问题:
songCircleProgress.setWaterLevelRatio((currentDurationPosition/1f)/(mainMediaPLayer.getDuration()/1f))