Bạn có thể dùng VolumeShaper
trong ứng dụng âm thanh để biểu diễn
hiệu ứng rõ dần, mờ dần, làm mờ dần, giảm độ sáng và các âm lượng tự động ngắn khác
chuyển đổi. Lớp VolumeShaper
có trong Android 8.0 (API cấp 26)
và sau đó.
Bạn tạo VolumeShaper
bằng cách gọi createVolumeShaper()
trên một thực thể của
AudioTrack
hoặc MediaPlayer
. Chiến lược phát hành đĩa đơn
VolumeShaper
chỉ hoạt động đối với âm thanh do AudioTrack hoặc MediaPlayer tạo ra
đã tạo ra nó.
Cấu hình VolumeShaper.
Hành vi của VolumeShaper
được xác định bằng
VolumeShaper.Configuration
Cấu hình chỉ định một
*đường cong thể tích, loại bộ nội suy và thời lượng.*
Đường cong thể tích
Đường cong thể tích biểu thị sự thay đổi biên độ theo thời gian. Mật khẩu này được xác định theo một cặp
gồm các mảng dấu phẩy động, x[] và y[] xác định một loạt các điểm điều khiển. Mỗi (x, y)
cặp đại diện cho thời gian và thể tích tương ứng. Các mảng phải có độ dài bằng nhau
và chứa ít nhất 2 và không quá 16 giá trị. (Độ dài tối đa của đường cong là
được xác định trong getMaximumCurvePoints()
.)
Các toạ độ thời gian được cho trong khoảng [0,0, 1,0]. Lần đầu tiên điểm phải là 0.0, điểm cuối cùng phải là 1.0 và thời gian phải là đơn điệu tăng lên.
Toạ độ thể tích được chỉ định theo thang đo tuyến tính trong khoảng [0,0, 1,0].
Loại bộ nội suy
Đường cong âm lượng luôn đi qua các điểm điều khiển được chỉ định. Giá trị
giữa các điểm điều khiển được lấy từ một đường spline theo
loại bộ nội suy của cấu hình. Có bốn hằng số cho giá trị
VolumeShaper
loại bộ nội suy:
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
- VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC
Thời lượng
Các toạ độ thời gian được chỉ định trong khoảng [0.0, 1.0] được chia tỷ lệ theo tỷ lệ mà bạn chỉ định bằng mili giây. Điều này xác định thời lượng thực tế theo thời gian của đường cong thể tích khi bộ tạo hình đang chạy và áp dụng đường cong cho đầu ra âm thanh.
Sử dụng VolumeShaper
Tạo cấu hình
Trước khi tạo VolumeShaper
, bạn phải tạo một thực thể của VolumeShaper.Configuration
. Thực hiện việc này bằng cách sử dụng
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})
Bắt đầu phát và trình tạo hình cùng một lúc. Điều này đảm bảo rằng việc phát lại bắt đầu từ khoảng lặng và âm lượng tăng lên mức âm lượng tối đa. Điều này được giải thích trong phần tiếp theo.
Chạy VolumeShaper
Mặc dù mức âm lượng của điểm điều khiển đầu tiên được áp dụng cho đường dẫn âm thanh
ngay sau khi tạo hình, trình tạo hình sẽ không di chuyển dọc theo đường cong
cho đến khi bạn gọi phương thức apply()
bằng VolumeShaper.Operation.PLAY
. Sau
khi tạo trình tạo hình dạng, lệnh gọi đầu tiên của apply()
phải chỉ định PLAY
để khởi động trình tạo hình. Công cụ này chạy đường cong từ điểm đầu tiên đến
điểm điều khiển cuối cùng:
Kotlin
shaper.apply(VolumeShaper.Operation.PLAY)
Java
shaper.apply(volumeShaper.Operation.PLAY);
Trong khi trình tạo hình đang chạy, bạn có thể thực hiện lệnh gọi apply()
xen kẽ, chỉ định
Thao tác NGỪNG và PHÁT. Thao tác này sẽ thay đổi hướng đọc to của
điểm điều khiển.
Công cụ tạo hình liên tục điều chỉnh âm lượng và đi qua tất cả các điểm điều khiển cho đến khi ưu đãi hết hạn. Điều này xảy ra khi trình tạo hình đạt đến cuối cùng (đối với PLAY vận hành) hoặc điểm điều khiển đầu tiên (đối với thao tác từ bỏ) trên đường cong.
Khi trình tạo hình hết hạn, âm lượng vẫn ở mức cài đặt gần đây nhất, có thể là
điểm điều khiển đầu tiên hoặc điểm điều khiển cuối cùng. Bạn có thể gọi VolumeShaper.getVolume()
cho
mức âm lượng hiện tại bất cứ lúc nào.
Sau khi trình tạo hình hết hạn, bạn có thể thực hiện một lệnh gọi apply()
khác để chạy đường cong
theo hướng ngược lại. Ví dụ: nếu trình tạo hình hết hạn trong khi đang chạy
PLAY
, apply()
tiếp theo phải là REVERSE
. Gọi PLAY
sau khi PLAY
có
đã hết hạn hoặc REVERSE
sau khi REVERSE
đã hết hạn không có hiệu lực.
Bạn phải thay thế các toán tử PLAY
và REVERSE
. Không có cách nào để phát
từ điểm điều khiển đầu tiên đến điểm điều khiển cuối cùng rồi khởi động lại từ điểm
điểm điều khiển đầu tiên. Bạn có thể sử dụng phương thức replace()
, được mô tả trong phần tiếp theo
để thay thế đường cong bằng bản sao của chính đường cong đó. Thao tác này sẽ đặt lại trình tạo hình,
yêu cầu thao tác PLAY
để khởi động lại.
Thay đổi đường cong
Sử dụng phương thức replace()
để thay đổi đường cong của VolumeShaper
. Phương thức này sử dụng
cấu hình, thao tác và tham số kết hợp. Bạn có thể gọi
replace()
bất cứ lúc nào, trong khi trình tạo hình đang chạy hoặc sau khi hết hạn:
Kotlin
val newConfig = VolumeShaper.Configuration.Builder() .setDuration(1000) .setCurve(floatArrayOf(0f, 0,5f), floatArrayOf(0f, 1f)) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) Hàm .build() kết hợp val = true shaper.thay thế(newConfig; VolumeShaper.Operation.PLAY, kết hợp)
Java
VolumeShaper.Configuration newConfig = VolumeShaper.Configuration.Builder() mới .setDuration(1000) .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f}) .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR) .build(); boolean kết hợp = đúng; shaper.thay thế(newConfig, VolumeShaper.Operation.PLAY, kết hợp);
Khi bạn gọi replace()
trong khi trình tạo hình đang chạy, trình tạo này sẽ ngừng thay đổi
âm lượng và giữ nguyên giá trị hiện tại. Sau đó, trình tạo hình cố gắng bắt đầu phiên bản mới
từ điểm điều khiển đầu tiên. Điều này có nghĩa là đối số của toán tử
kiểm soát việc trình tạo hình có chạy sau lệnh gọi hay không. Chỉ định PLAY
để
ngay lập tức bắt đầu đường cong mới, chỉ định REVERSE
để tạm dừng trình tạo hình tại
thể tích của điểm điều khiển đầu tiên trong đường cong mới. Bạn có thể khởi động trình tạo hình
sau này với apply(VolumeShaper.Operation.PLAY)
.
Khi bạn gọi replace()
bằng join = false
, trình tạo hình sẽ bắt đầu đường cong tại
cấp độ do điểm điều khiển đầu tiên chỉ định. Điều này có thể gây gián đoạn
trong phần âm lượng. Bạn có thể tránh điều này bằng cách gọi replace()
bằng join = true
.
Thao tác này sẽ đặt điểm điều khiển đầu tiên của đường cong mới thành mức hiện tại của
trình định hình và chia tỷ lệ thể tích của tất cả các điểm điều khiển giữa
để duy trì hình dạng tương đối của đường cong mới (điểm điều khiển cuối cùng là
không thay đổi). Thao tác điều chỉnh tỷ lệ sẽ thay đổi vĩnh viễn các điểm điều khiển trong
đường cong mới của người tạo hình.
Xoá VolumeShaper
Hệ thống đóng lại và rác sẽ thu thập VolumeShaper
khi hệ thống AudioTrack
hoặc
MediaPlayer
đã được phát hành hoặc không còn được sử dụng. Bạn có thể gọi phương thức close()
vào một chiếc máy quét để phá huỷ nó ngay lập tức. Hệ thống sẽ xoá bộ tạo hình khỏi
đường dẫn âm thanh trong khoảng 20 mili giây. Hãy cẩn thận khi đóng VolumeShaper
trong khi âm thanh đang phát. Nếu trình tạo hình có âm lượng nhỏ hơn 1,0 khi bạn gọi
close()
, tỷ lệ âm lượng của trình tạo hình sẽ thay đổi thành 1.0. Điều này có thể khiến sự cố
số lượng.