你可以在音訊應用程式中使用 VolumeShaper
執行
淡入、淡出、交叉淡出、降低背景音量和其他短暫自動音量
轉場效果VolumeShaper
類別適用於 Android 8.0 (API 級別 26)
和更新的版本。
您可以在VolumeShaper
createVolumeShaper()
AudioTrack
或MediaPlayer
。
VolumeShaper
僅適用於 AudioTrack 或 MediaPlayer 產生的音訊
建立該專案的所有專案
VolumeShaper.Configuration
VolumeShaper
的行為是由其定義
VolumeShaper.Configuration
。設定會指定
*音量曲線、內插器類型和時間長度*。
音量曲線
音量曲線代表的是一段時間內的振幅變化。它是由一對
定義一系列控制點的浮點陣列、x[] 和 y[]。每個 (x, y)
組合則分別代表時間和音量。陣列的長度必須相等
,且至少要包含 2 個值,最多 16 個。(曲線長度上限為
定義於 getMaximumCurvePoints()
中)。
時間座標是以 [0.0, 1.0] 為區間。第一次 點必須為 0.0,最後一個值必須為 1.0,而且時間必須單調 而且數量仍在持續增加
指定時間範圍內的音量座標,以線性比例表示 [0.0, 1.0]。
內插器類型
音量曲線一律會通過指定控制點。值
控制點之間是由水線所衍生,並按照
設定的內插器類型有四個常數
VolumeShaper
個內插器類型:
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
時間長度
間隔 [0.0, 1.0] 中的指定時間座標會縮放為 指定的播放時間 (以毫秒為單位)這會決定 建立形狀時,音量曲線的時間以及將曲線套用至 例如音訊輸出
使用 VolumeShaper
建立設定
建構 VolumeShaper
之前,您必須建立 VolumeShaper.Configuration
的例項。方法是使用
VolumeShaper.Configuration.Builder()
:
Kotlin
val config: VolumeShaper.Configuration = VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(floatArrayOf(0f, 1f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build()
Java
VolumeShaper.Configuration config = new VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build();
With no arguments the VolumeShaper.Configuration.Builder
constructor returns a
builder that creates a configuration with default settings:
INTERPOLATOR_TYPE_CUBIC, a one second duration, and no curve. You must add a
curve to the builder before calling build()
.
The framework provides constants for configurations with pre-built curves, each with one second duration:
VolumeShaper.Configuration.LINEAR_RAMP
VolumeShaper.Configuration.CUBIC_RAMP
VolumeShaper.Configuration.SINE_RAMP
VolumeShaper.Configuration.SCURVE_RAMP
Creating a VolumeShaper
To create a VolumeShaper
, call createVolumeShaper()
on an instance of the
appropriate class, passing in a VolumeShaper.Configuration
:
Kotlin
volumeShaper = myMediaPlayer.createVolumeShaper(config) volumeShaper = myAudioTrack.createVolumeShaper(config)
Java
volumeShaper = myMediaPlayer.createVolumeShaper(config); volumeShaper = myAudioTrack.createVolumeShaper(config);
A single track or media player can have many shapers attached to it, and you can
control each shaper separately. The outputs of all the shapers on a track or
player are multiplied together. A VolumeShaper
cannot be shared between
AudioTracks
or MediaPlayers
, but you can use the same configuration in calls
to createVolumeShaper
to build identical shapers on multiple AudioTracks
or
MediaPlayers
.
When you create the shaper, its first control point (at t = 0) is applied to the
audio stream. If the initial volume is not 1.0 and your app is playing material
at create time, your audio might have an abrupt change in volume. Best practice
is to start playing audio from silence and use a VolumeShaper
to implement a
fade-in when playback starts. Create a VolumeShaper
that starts at 0 volume
and fades up. For example:
setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
同時開始播放和圖形。這樣可確保影片 從無聲開始,並將音量調高至最大音量。相關說明請參閱 請參閱下一節的說明。
執行 VolumeShaper
雖然第一個控制點的音量等級會套用到音訊路徑
形狀建立完成後,形狀就不會沿著曲線進度前進
直到您使用 VolumeShaper.Operation.PLAY
呼叫 apply()
方法為止。更新後
建立形狀工具,第一次叫用 apply()
時必須指定 PLAY
作業才能啟動形狀。這樣就能從頭到尾
最後的控制點:
Kotlin
Shaper.apply(VolumeShaper.Operation.PLAY)
Java
Shaper.apply(VolumeShaper.Operation.PLAY);
在 Shaper 執行期間,您可以發出交替的 apply()
呼叫,並指定
REVERSE 和 PLAY 作業。這會變更朗讀前的方向
每個控制點
形狀工具會持續調整音量,並通過所有控制點 直到過期。當形狀到達最後一個 (如果是 PLAY) 時,就會發生這種情況 運算) 或第一個 (用於 REVERSE 運算) 控制點。
形狀元件到期時,音量會維持在最後設定,
第一個或最後一個控制點你可以致電「VolumeShaper.getVolume()
」:
目前的音量大小
形狀工具到期後,您可以再次發出 apply()
呼叫來執行曲線
就會顯示反向的閃光效果舉例來說,如果形狀工具在執行期間過期
PLAY
,下一個 apply()
必須為 REVERSE
。在 PLAY
後撥打 PLAY
到期,或REVERSE
到期後 REVERSE
,則沒有任何作用。
您必須替代 PLAY
和 REVERSE
作業。你無法播放
從第一個控制點到最後一個控制點,再從
第一個控制點您可以使用 replace()
方法,如下一節所述
部分中,將曲線替換為本身的副本。這項動作會重設形狀
則需要 PLAY
作業才能再次啟動。
變更曲線
使用 replace()
方法即可變更 VolumeShaper
的曲線。這個方法
設定、作業和彙整參數。您可以呼叫
replace()
方法。當 Shaper 執行時或形狀到期後,隨時都可以執行以下動作:
Kotlin
val newConfig = VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build() val 彙整 = true Shaper.replace(newConfig, VolumeShaper.Operation.PLAY, 彙整)
Java
VolumeShaper.Configuration newConfig = 新的 VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(新浮點值 [] {0.f, 0.5f}, 新浮點值 [] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build(); 布林彙整 = true; Shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);
如果您在 Shaper 執行期間呼叫 replace()
,會停止變更
並保持目前的值接著,形狀工具會嘗試開始新的
從第一個控制點開始曲線也就是說
控制 Shaper 在呼叫後是否執行。將 PLAY
指定為
立即開始新曲線,指定 REVERSE
讓形狀在以下位置維持暫停狀態
新曲線上第一個控制點的音量。你可以啟動這個形狀
稍後使用 apply(VolumeShaper.Operation.PLAY)
。
使用 join = false
呼叫 replace()
時,形狀工具會從
受到第一個控制點指定的等級這可能會導致遊戲中斷
音量如要避免這種情況發生,可以使用 join = true
呼叫 replace()
。
這會將新曲線的第一個控制點設為
形狀和調整第一個和
最後是維持新曲線的相對形狀 (最後一個控制點是
不變)。縮放作業會永久變更
形狀的全新曲線
移除 VolumeShaper
系統會關閉並垃圾收集 VolumeShaper
,其 AudioTrack
或
MediaPlayer
發布或不再使用。您可以呼叫 close()
方法
即可立即刪除形狀系統會將形狀從
音訊管道。關閉VolumeShaper
時請務必謹慎
以及是否要繼續播放撥打電話時,如果形狀的音量低於 1.0
close()
,形狀工具的音量比例會變更為 1.0。這可能會導致突然