我正在使用seekbar來更改我的MediaPlayer的音量。進度級別是我使用的「1到100」int。我需要將其轉換爲0.0f到1.0f的浮點範圍。這樣做的正確方法是什麼?int浮動mediaplayer.setVolume()
謝謝你們
我正在使用seekbar來更改我的MediaPlayer的音量。進度級別是我使用的「1到100」int。我需要將其轉換爲0.0f到1.0f的浮點範圍。這樣做的正確方法是什麼?int浮動mediaplayer.setVolume()
謝謝你們
float fVal = (float)val/100;
應該做的伎倆。
除以100
int intValue = 1;
float floatValue = intValue/100.0;
線性映射到範圍0.0
到1.0
使用
int n = <some value>;
float val = (float)(n - 1)/99;
另請注意,您可以更改seekbar返回的數字範圍,1-> 100僅爲默認值。 – Cesar
非常晚了一天,但我只是讀了關於這個主題我認爲它值得張貼的不只是一個答案將滑塊值0 - 100的直線線性縮放比例轉換爲浮點值0.0 - 1.0,並解釋爲什麼您應該以不同的方式進行操作。
因此API documentation的MediaPlayer.setVolume(float, float)
表明,「UI控件應按對數縮放」,但並不能解釋原因。
我們聽到的聲音以分貝(db)爲單位,以對數刻度表示。簡單來說(如果你是一個音頻愛好者,過分簡化),兩倍的分貝=兩倍的音量。但是因爲分貝尺度是對數的,所以從(例如)0 - 3db的比例尺上的距離大於從3db到6db的尺度上的距離。
使用線性縮放而不是對數的最明顯的效果是,滑塊在最大的音量比在中途的音量大兩倍,因此大部分音量級別的明顯變化發生在降低滑塊範圍的四分之三(大約),而不是整個滑塊範圍內的(明顯)線性方式。這就是爲什麼直線縮放並不是將滑塊位置轉換爲setVolume
方法的值的正確方法。
這裏有一個簡單的功能,將你的滑塊值(假設躺在範圍爲0 - 100),將其轉換成一個對數值和規模:在50
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;
}
現在,滑塊(中心位置)將產生大約是當滑塊在100(最高位置)時大約一半的聲音,並且在25處的滑塊將產生比當滑塊在50時大聲一半的聲音。
請注意,您對「兩倍響亮」的看法會受到您所播放音頻的種類以及演講者的質量以及演講者的難易程度的影響正在推...
謝謝!現在看起來很明顯,但9小時後很難想象! – Jonno
長時間可以輕鬆地將編碼器的大腦變成糊狀:) –