TL; DR: Я шукаю повний робочий зразок того, що я буду називати сценарієм "трифрагментної анімації Gmail". Зокрема, ми хочемо почати з двох фрагментів, таких як:
Після деякої події інтерфейсу (наприклад, натискання на щось у фрагменті B), ми хочемо:
- Фрагмент А, щоб зісковзнути з екрана вліво
- Фрагмент B пересуне до лівого краю екрану і зменшиться, щоб зайняти місце, звільнене фрагментом A
- Фрагмент C, щоб засунути з правого боку екрана і зайняти місце, звільнене фрагментом B
І, натиснувши кнопку НАЗАД, ми хочемо, щоб цей набір операцій було змінено.
Тепер я бачив безліч часткових реалізацій; Я розгляну чотири з них нижче. Окрім того, що вони є неповними, вони мають свої проблеми.
@Reto Meier зробив цю популярну відповідь на той самий основний запитання, вказавши, що ви б використовували setCustomAnimations()
з a FragmentTransaction
. У сценарії з двома фрагментами (наприклад, ви бачите лише фрагмент A спочатку і хочете замінити його на новий фрагмент B з використанням анімованих ефектів), я повністю згоден. Однак:
- Оскільки ви можете вказати лише одну "в" та одну "вихідну" анімацію, я не можу побачити, як би ви обробляли всі різні анімації, необхідні для сценарію з трьома фрагментами
- У
<objectAnimator>
своєму зразковому коді використовуються жорсткі провідні позиції у пікселях, і це може здатися недоцільним з огляду на різний розмір екрана, алеsetCustomAnimations()
вимагає анімаційних ресурсів, що виключає можливість визначення цих речей на Java - Я в занепокоєнні, як аніматори об'єктів для масштабу пов'язуються з такими речами, як
android:layout_weight
уLinearLayout
для розподілу місця у відсотках - Я в подиві щодо того , як фрагмент C обробляється в самому початку (
GONE
?android:layout_weight
Про0
? Заздалегідь анімований шкалою від 0? Що - то інше?)
@Roman Nurik вказує, що ви можете анімувати будь-яке майно , включаючи те, яке ви самі визначаєте. Це може допомогти вирішити проблему з провідними позиціями за рахунок створення власного підкласу менеджера макета. Це допомагає деяким, але я все ще здивований рештою рішення Рето.
Автор цього запису на пастбіні показує деякий плідокод, що вразливий, в основному каже, що всі три фрагменти спочатку перебуватимуть у контейнері, а фрагмент C прихований в самому початку hide()
операції транзакції. Ми тоді show()
C і hide()
A, коли відбувається подія інтерфейсу користувача. Однак я не бачу, як це справляється з тим, що B змінює розмір. Він також покладається на те, що ви, мабуть, можете додати кілька фрагментів до одного контейнера, і я не впевнений, чи є це надійною поведінкою протягом тривалого періоду (не кажучи вже про те, що воно повинно ламатись findFragmentById()
, хоча я можу з цим жити).
Автор цієї публікації в блозі вказує, що Gmail взагалі не використовує setCustomAnimations()
, а натомість безпосередньо використовує аніматори об’єктів ("ви просто змінюєте лівий край кореневого виду + змінюєте ширину правого виду"). Однак це все ще дво фрагментне рішення AFAICT, і реалізація ще раз показала розміри жорстких проводів у пікселях.
Я продовжую підключатися до цього, тому, можливо, коли-небудь відповім на це, але я дуже сподіваюся, що хтось розробив трифрагментне рішення для цього сценарію анімації і зможе опублікувати код (або посилання на нього). Анімації в Android змушують мене витягнути волосся, і ті з вас, хто бачив мене, знають, що це багато в чому безрезультатне починання.