int to float for mediaplayer.setVolume()

时间:2011-08-12 06:59:55

标签: java android floating-point media-player int

我正在使用搜索栏来更改MediaPlayer的音量。我正在使用的进度级别为“1到100”int。我需要将其转换为0.0f到1.0f的浮动范围。这样做的正确方法是什么?

谢谢你们

4 个答案:

答案 0 :(得分:3)

float fVal = (float)val / 100;应该可以解决问题。

答案 1 :(得分:2)

除以100

int intValue = 1;
float floatValue = intValue/100.0;

答案 2 :(得分:2)

当天很晚,但是当我刚刚阅读这个主题时,我认为值得发布一个答案,不仅仅是将滑块值0 - 100的直线性缩放变为浮点值0.0 - 1.0并解释为什么你应该采用不同的方式。

因此MediaPlayer.setVolume(float, float) setVolume表示“UI控件应按对数比例缩放”,但不解释原因。

我们听到的声音以分贝(db)为单位,以对数刻度测量。简单来说(如果你是音频爱好者则过度简化),分贝的两倍=音量的两倍。但由于分贝尺度是对数的,因此距离(例如)0 - 3db的距离大于从3db到6db的尺度上的距离。

使用线性缩放而不是对数的最明显效果是滑块最大的音量大于中间音量的两倍,因此音量水平的大部分明显变化发生在较低的位置滑块范围的四分之三(大约),而不是整个滑块范围内的(明显)线性方式。这就是为什么直线缩放不是将滑块位置转换为private float scaleVolume(int sliderValue) { double dSliderValue = sliderValue; double logSliderValue = Math.log10(dSliderValue / 10); double logMaxSliderValue = Math.log10(10); float scaledVolume = (float) (logSliderValue / logMaxSliderValue); return scaledVolume; } 方法的值的正确方法。

这是一个简单的函数,它将获取滑块值(假设位于0 - 100范围内),将其转换为对数值并进行缩放:

{{1}}

现在,50处的滑块(中心位置)将产生的声音大约是滑块处于100(顶部位置)时的一半,而25处的滑块将产生一半的声音滑块位于50时响亮。

请注意,您所播放的音频类型以及扬声器的质量以及推动音量的难度会影响您对“两倍大声”的感知......

答案 3 :(得分:1)

要线性地映射到范围0.01.0,请使用

int n = <some value>;
float val = (float)(n - 1)/99;