TL; DR: Tôi đang tìm kiếm một mẫu hoàn chỉnh về những gì tôi sẽ gọi là kịch bản "hoạt hình ba đoạn của Gmail". Cụ thể, chúng tôi muốn bắt đầu với hai mảnh, như thế này:
Theo một số sự kiện UI (ví dụ: nhấn vào thứ gì đó trong Đoạn B), chúng tôi muốn:
- Đoạn A để trượt khỏi màn hình sang trái
- Đoạn B để trượt sang cạnh trái của màn hình và co lại để chiếm lấy vị trí bị bỏ trống bởi Đoạn A
- Đoạn C để trượt vào từ bên phải màn hình và chiếm lấy vị trí bị bỏ trống bởi Đoạn B
Và, trên một nút BACK, chúng tôi muốn bộ thao tác đó được đảo ngược.
Bây giờ, tôi đã thấy rất nhiều triển khai một phần; Tôi sẽ xem xét bốn trong số họ dưới đây. Ngoài việc không đầy đủ, tất cả họ đều có vấn đề của họ.
@Reto Meier đã đóng góp câu trả lời phổ biến này cho cùng một câu hỏi cơ bản, chỉ ra rằng bạn sẽ sử dụng setCustomAnimations()
với a FragmentTransaction
. Đối với kịch bản hai đoạn (ví dụ: ban đầu bạn chỉ nhìn thấy Đoạn A và muốn thay thế nó bằng Đoạn B mới bằng hiệu ứng hoạt hình), tôi hoàn toàn đồng ý. Tuy nhiên:
- Vì bạn chỉ có thể chỉ định một hoạt hình "trong" và một hoạt hình "ngoài", tôi không thể thấy cách bạn sẽ xử lý tất cả các hoạt ảnh khác nhau cần thiết cho kịch bản ba đoạn
- Các
<objectAnimator>
trong mã mẫu của mình sử dụng các vị trí hard-wired bằng pixel, và đó dường như là không thực tế cho thay đổi kích thước màn hình, tuy nhiênsetCustomAnimations()
đòi hỏi nguồn lực hoạt hình, loại trừ khả năng xác định những điều này trong Java - Tôi không biết làm thế nào các nhà hoạt họa đối tượng cho quy mô gắn kết với những thứ như
android:layout_weight
trong mộtLinearLayout
việc phân bổ không gian trên cơ sở tỷ lệ phần trăm - Tôi đang ở một mất mát như thế nào Fragment C được xử lý ngay từ đầu (
GONE
?android:layout_weight
Của0
? Pre-hoạt hình để thang điểm từ 0? Cái gì khác?)
@Roman Nurik chỉ ra rằng bạn có thể làm động bất kỳ tài sản nào , kể cả những tài sản mà bạn tự xác định. Điều đó có thể giúp giải quyết vấn đề của các vị trí có dây cứng, với chi phí phát minh ra lớp con trình quản lý bố cục tùy chỉnh của riêng bạn. Điều đó giúp ích cho một số người, nhưng tôi vẫn gặp khó khăn với phần còn lại của giải pháp Reto.
Tác giả của mục pastebin này cho thấy một số mã giả trêu ngươi, về cơ bản nói rằng cả ba mảnh vỡ sẽ nằm trong container ban đầu, với Fragment C được ẩn ngay từ đầu thông qua một hide()
hoạt động giao dịch. Chúng tôi sau đó show()
C và hide()
A khi sự kiện UI xảy ra. Tuy nhiên, tôi không thấy cách xử lý thực tế là B thay đổi kích thước. Nó cũng dựa vào thực tế là bạn rõ ràng có thể thêm nhiều mảnh vỡ vào cùng một thùng chứa, và tôi không chắc đó có phải là hành vi đáng tin cậy trong thời gian dài hay không (không đề cập đến việc nó có bị phá vỡ hay không findFragmentById()
, mặc dù tôi có thể sống với điều đó).
Tác giả của bài đăng trên blog này chỉ ra rằng Gmail hoàn toàn không sử dụng setCustomAnimations()
mà thay vào đó sử dụng trực tiếp các trình hoạt hình đối tượng ("bạn chỉ cần thay đổi lề trái của chế độ xem gốc + thay đổi độ rộng của chế độ xem bên phải"). Tuy nhiên, đây vẫn là một giải pháp hai mảnh AFAICT và việc triển khai được hiển thị một lần nữa kích thước dây cứng tính bằng pixel.
Tôi sẽ tiếp tục thực hiện điều này, vì vậy tôi có thể tự mình trả lời câu hỏi này vào một ngày nào đó, nhưng tôi thực sự hy vọng rằng ai đó đã tìm ra giải pháp ba đoạn cho kịch bản hoạt hình này và có thể đăng mã (hoặc một liên kết ở đó). Ảnh động trong Android khiến tôi muốn nhổ tóc và những người đã xem tôi biết rằng đây là một nỗ lực không có kết quả.