Java mediaplayer.setVolume()的浮点整数

Java mediaplayer.setVolume()的浮点整数,java,android,floating-point,media-player,int,Java,Android,Floating Point,Media Player,Int,我正在使用seekbar更改MediaPlayer的音量。进度级别是我正在使用的,它给出了一个“1到100”的整数。我需要将其转换为0.0f到1.0f的浮动范围。正确的做法是什么 谢谢大家除以100 int intValue = 1; float floatValue = intValue/100.0; 除以100 int intValue = 1; float floatValue = intValue/100.0; float fVal=(float)val/100应该可以做到这一点。f

我正在使用seekbar更改MediaPlayer的音量。进度级别是我正在使用的,它给出了一个“1到100”的整数。我需要将其转换为0.0f到1.0f的浮动范围。正确的做法是什么

谢谢大家

除以100

int intValue = 1;
float floatValue = intValue/100.0;
除以100

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

float fVal=(float)val/100应该可以做到这一点。

float fVal=(float)val/100
应该可以做到这一点。

要线性映射到
0.0
1.0
的范围,请使用

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

要线性映射到范围
0.0
1.0
使用

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

那天很晚了,但当我刚刚阅读这个主题时,我认为值得发布一个答案,它不只是将滑块值0-100直接线性缩放为浮点值0.0-1.0,并解释为什么应该以不同的方式进行

因此,for
MediaPlayer.setVolume(float,float)
顺带指出,“UI控件应按对数缩放”,但没有解释原因

我们听到的声音是以分贝(db)为单位,以对数标度测量的。简而言之(如果你是一个音频爱好者,那就过于简化了),两倍的分贝=两倍的音量。但由于分贝标度是对数的,因此标度上0-3db的距离比标度上3db到6db的距离大

使用线性缩放而不是对数缩放的最明显效果是,滑块处于最大值时的音量是半路时音量的两倍多,因此音量级别的大部分显著变化发生在滑块范围的较低四分之三(大约)处,而不是在(明显的)较低的四分之三处整个滑块范围内的线性时尚。这就是为什么直线线性缩放不是将滑块位置转换为
setVolume
方法值的正确方法

下面是一个简单的函数,它将获取滑块值(假定在0-100范围内),将其转换为对数值并缩放:

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;

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


请注意,您对“双倍音量”的感知将受到您播放的音频类型、扬声器的质量以及播放力度的影响…

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

因此,for
MediaPlayer.setVolume(float,float)
顺带指出,“UI控件应按对数缩放”,但没有解释原因

我们听到的声音是以分贝(db)为单位,以对数标度测量的。简而言之(如果你是一个音频爱好者,那就过于简化了),两倍的分贝=两倍的音量。但由于分贝标度是对数的,因此标度上0-3db的距离比标度上3db到6db的距离大

使用线性缩放而不是对数缩放的最明显效果是,滑块处于最大值时的音量是半路时音量的两倍多,因此音量级别的大部分显著变化发生在滑块范围的较低四分之三(大约)处,而不是在(明显的)较低的四分之三处整个滑块范围内的线性时尚。这就是为什么直线线性缩放不是将滑块位置转换为
setVolume
方法值的正确方法

下面是一个简单的函数,它将获取滑块值(假定在0-100范围内),将其转换为对数值并缩放:

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;

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


请注意,您对“双倍音量”的感知将受到您播放的音频类型、扬声器质量以及播放力度的影响…

另外请注意,您可以更改seekbar返回的数字范围,1->100只是默认值。另外请注意,您可以更改seekbar返回的数字范围,1->100只是默认值。谢谢!现在看起来很明显,但9小时后就很难思考了!谢谢现在看起来很明显,但9小时后就很难思考了!