簡體   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