繁体   English   中英

int 浮动为 mediaplayer.setVolume()

[英]int to float for mediaplayer.setVolume()

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

多谢你们

float fVal = (float)val / 100; 应该做的伎俩。

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

因此, MediaPlayer.setVolume(float, float)API 文档顺便指出,“UI 控件应该以对数方式缩放”,但没有解释原因。

我们听到的声音以分贝 (db) 为单位,采用对数刻度。 简而言之(如果您是音频爱好者,那就过于简化了),两倍分贝 = 两倍音量。 但是因为分贝刻度是对数的,所以(例如)0 - 3db 刻度上的距离大于 3db 到 6db 刻度上的距离。

使用线性缩放而不是对数缩放最明显的效果是,slider 最大的音量是中途音量的两倍多,因此音量水平的大部分明显变化发生在较低的四分之三(大约)slider 范围,而不是在整个 slider 范围内以(显然)线性方式。 这就是为什么直线缩放不是将 slider position 转换为setVolume方法的值的正确方法。

这是一个简单的 function ,它将获取您的 slider 值(假设位于 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;

}

现在,slider 在 50(中心位置)将产生的声音大约是 slider 在 100(顶部位置)时的一半,而 slider 产生的声音是在 slider 时的一半slider 为 50。

请注意,您对“两倍响”的感知将受到您正在播放的音频类型以及扬声器的质量以及推动它的力度的影响......

除以 100

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

到 map 线性到0.01.0的范围使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM