Bạn có thể tạo ảnh động và hiệu ứng chuyển đổi tuỳ chỉnh cho thuộc tính trong ứng dụng, ảnh động tuỳ chỉnh trên nhiều hoạt động và ảnh động tuỳ chỉnh trên nhiều mảnh bằng cử chỉ xem trước thao tác quay lại bằng cách sử dụng Khung hiển thị hoặc Compose. Để dùng cách của Compose, hãy xem phần Thêm tính năng hỗ trợ cho ảnh động xem trước thao tác quay lại.
Thêm hiệu ứng chuyển đổi tuỳ chỉnh bằng Progress API
Trên AndroidX Activity 1.8.0-alpha01 trở lên, bạn có thể sử dụng Predictive Back Progress API để phát triển các ảnh động tuỳ chỉnh cho cử chỉ xem trước thao tác quay lại trong ứng dụng. Progress API rất hữu ích trong việc tạo ảnh động cho các khung hiển thị nhưng có những hạn chế khi tạo ảnh động cho các hiệu ứng chuyển đổi giữa các mảnh. Trong OnBackPressedCallback, chúng tôi đã ra mắt các phương thức handleOnBackProgressed, handleOnBackCancelled và handleOnBackStarted để tạo ảnh động cho đối tượng trong khi người dùng vuốt ngược lại. Hãy sử dụng các phương thức này nếu bạn cần tuỳ chỉnh nhiều hơn số ảnh động mặc định do hệ thống hoặc ảnh động Thành phần Material cung cấp.
Chúng tôi dự kiến rằng hầu hết ứng dụng sẽ dùng các API AndroidX tương thích ngược. Tuy nhiên, trong giao diện OnBackAnimationCallback cũng có sẵn các API nền tảng tương tự để kiểm thử trong Android 14 trở lên.
Sử dụng Progress API với hiệu ứng chuyển đổi AndroidX
Bạn có thể sử dụng Progress API với AndroidX Transitions 1.5.0-alpha01 trở lên trên Android 14 trở lên để tạo các hiệu ứng chuyển đổi Xem trước thao tác quay lại.
- Sử dụng
TransitionManager#controlDelayedTransitionthay vìbeginDelayedTransitionđể phát các hiệu ứng chuyển đổi khi người dùng vuốt ngược lại. - Tạo hiệu ứng chuyển đổi trong
handleOnBackStarted. - Phát hiệu ứng chuyển đổi với sự kiện quay lại trong
handleOnBackProgressedbằng cách liên kếtcurrentFractionvớiBackEvent.progressđể cho biết khoảng cách mà người dùng đã vuốt ngược lại. - Hoàn tất hiệu ứng chuyển đổi sau khi người dùng thực hiện cử chỉ quay lại trong
handleOnBackPressed. - Cuối cùng, đặt lại hiệu ứng chuyển đổi trong
handleOnBackCancelled.
Video, mã Kotlin và XML sau đây minh hoạ hiệu ứng chuyển đổi tuỳ chỉnh giữa 2 hộp được triển khai bằng OnBackPressedCallback:
class MyFragment : Fragment() { val transitionSet = TransitionSet().apply { addTransition(Fade(Fade.MODE_OUT)) addTransition(ChangeBounds()) addTransition(Fade(Fade.MODE_IN)) } ... override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val callback = object : OnBackPressedCallback(enabled = false) { var controller: TransitionSeekController? = null @RequiresApi(34) override fun handleOnBackStarted(backEvent: BackEvent) { // Create the transition controller = TransitionManager.controlDelayedTransition( binding.card, transitionSet ) changeTextVisibility(ShowText.SHORT) } @RequiresApi(34) override fun handleOnBackProgressed(backEvent: BackEvent) { // Play the transition as the user swipes back if (controller?.isReady == true) { controller?.currentFraction = backEvent.progress } } override fun handleOnBackPressed() { // Finish playing the transition when the user commits back controller?.animateToEnd() this.isEnabled = false } @RequiresApi(34) override fun handleOnBackCancelled() { // If the user cancels the back gesture, reset the state transition(ShowText.LONG) } } binding.shortText.setOnClickListener { transition(ShowText.LONG) callback.isEnabled = true } this.requireActivity().onBackPressedDispatcher.addCallback(callback) } private fun transition(showText: ShowText) { TransitionManager.beginDelayedTransition( binding.card, transitionSet ) changeTextVisibility(showText) } enum class ShowText { SHORT, LONG } private fun changeTextVisibility(showText: ShowText) { when (showText) { ShowText.SHORT -> { binding.shortText.isVisible = true binding.longText.isVisible = false } ShowText.LONG -> { binding.shortText.isVisible = false binding.longText.isVisible = true } } } }
<?xml version="1.0" encoding="utf-8"?>
...
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
...>
<TextView
android:id="@+id/short_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
... />
<TextView
android:id="@+id/long_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
.../>
</androidx.constraintlayout.widget.ConstraintLayout>
Khi sử dụng hiệu ứng chuyển đổi Xem trước thao tác quay lại, hãy lưu ý làm như sau:
- Dùng
isSeekingSupportedđể kiểm tra xem hiệu ứng chuyển đổi có hỗ trợ cử chỉ Xem trước thao tác quay lại hay không. - Ghi đè
isSeekingSupportedđể trả về giá trị true cho hiệu ứng chuyển đổi tuỳ chỉnh. - Tạo một bộ điều khiển cho mỗi ảnh động.
- Hiệu ứng chuyển đổi Xem trước thao tác quay lại được hỗ trợ với hiệu ứng chuyển đổi AndroidX, nhưng không được hỗ trợ với hiệu ứng chuyển đổi khung. Di chuyển khỏi các lượt chuyển đổi khung và thay vào đó sử dụng
Animatorvà các lượt chuyển đổi AndroidX. - Hiệu ứng chuyển đổi Xem trước thao tác quay lại được hỗ trợ trên các thiết bị chạy Android 14 trở lên và không tương thích ngược.
- Các hiệu ứng chuyển đổi được tạo bằng cảnh XML cũng được hỗ trợ. Trong
handleOnBackStarted, hãy đặtTransitionSeekControllerthành kết quả củaTransitionManager.createSeekControllerthay vì kết quả củacontrolDelayedTransition.
Tài nguyên khác
- Mã mẫu xem trước thao tác quay lại
- Kiến thức cơ bản về video trước đây của hệ thống
- Xây dựng tương lai của video trên Android