Як анімувати вигляд в Android і залишити його в новому положенні / розмірі?


81

В даний час у моєму додатку для Android є подання, і воно відтворює анімацію кадру. Я хочу анімувати вид, щоб збільшити його розмір до 150%. Коли я застосовую масштабну анімацію до неї, і масштабна анімація завершена, я хочу, щоб глядач залишався на такому новому розмірі до кінця життєвого циклу діяльності. На жаль, зараз, коли анімація масштабування завершена, подання повертається до початкового розміру. Як я можу отримати його, щоб зберегти нову анімовану трансформацію?

Я використовую

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

Дякую!

Відповіді:


150

Не забудьте додати атрибути нижче до кореневого елементу у вашій анімації xml:

android:fillAfter="true" 
android:fillEnabled="true"

7
Це справжня відповідь. OP повинен змінити це, щоб прийнята відповідь. Дякую Qlimax !! (PS, це не задокументовано в розділі "Анімація" Посібника для розробників, це зафіксовано лише в javadocs для класу "Анімація". Така погана документація!)
Ніл Трафт,

7
куди поставити цей код? в <set ...></set>або в тегах анімації ( translate| rotate| scale)?
xxxxxxxxxadfas

5
як зазначено нижче, ви повинні додати його до встановленого параметра
cV2

3
Це не працює. Я хочу, щоб реальний розмір вигляду змінювався з анімацією. Це лише змінює вміст. Я змінюю шкалу Y з 1,0 на 0,0, і анімація відбувається, але залишає порожній простір там, де раніше був вигляд. Крім того, я спробував View.GONE, але це прив'язує інші види до порожнього простору. Мені потрібні інші подання, щоб відповідати розміру масштабованого подання, поки він зменшується. Як змусити це працювати?
Судханшу

1
Будь-хто, хто читає це, зауважує, що fillAfterбуде зберігати лише пікселі перегляду, поки фактичний вигляд все ще буде у вихідному положенні. Вам потрібно вручну встановити LayoutParamsваш вигляд, можливо, у onAminationEnd (слухач).
Мухаммед Бабар,


32

якщо ви хочете розмістити анімацію у форматі xml , це може знадобитися для допомоги:

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

будь ласка, також оцініть іншу відповідь, допомогла мені :) удачі!


22

У наш час це стало дуже легко:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(У цьому фрагменті використано ViewPropertyAnimator).

Можна також додати кілька інших варіантів.

Вид буде розміщений у новому положенні.


Це слід опублікувати як популярну тему
Kotik_o

2

EDIT: Відповідь Qlimax краща, але оскільки OP не повернувся, щоб змінити галочку, і я не можу видалити прийняту відповідь, скопіюю її сюди: просто встановіть fillAfter = true fillEnabled = true

Моя оригінальна відповідь (яка працює, але порівняно трохи смішна):

Щоб речі працювали належним чином після анімації, принаймні відповідно до цього потоку , вам доведеться написати onAnimationEndобробник, і там вручну налаштуйте "реальні" (до трансформації) межі вашого перегляду відповідно до кінцевого результату масштабна анімація.


Привіт Вальтере. Я переписав onAnimationEnd, але не знаю, як налаштувати "реальні" межі подання відповідно до масштабу анімації. Я знаю, який саме dp я хочу, щоб він закінчився, але я не можу знайти функцію "setWidth ()" або "setHeight ()".
justinl

1
Я вважаю, що вони зберігаються в LayoutParams. Ви повинні вміти це робити view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (Останній дзвінок необхідний, щоб повідомити дерево перегляду, що його потрібно перерахувати.)
Уолтер Мундт

2
Це неймовірно обхідний спосіб робити щось. Все, що потрібно зробити, це встановити атрибути, android:fillEnabledі android:fillAfterщоб обидва були істинними.
Ніл Трафт,

1

Насправді, оскільки анімація, яку ви використовуєте, здається, вбудована в фреймворк Android, я не впевнений, що ви можете щось змінити в ній.
Однак ви можете створити власну анімацію, слідуючи прикладу в документації . І вам доведеться поставити android: fillAfter = "true", якщо ви хочете, щоб масштабування зберігалося після закінчення анімації.


2
scaleUp150 - це спеціальна анімація, яку я написав у форматі xml (хоча вона надзвичайно проста). Я дійсно помістив android: fillAfter = "true" всередину анімації, але він все одно повертається до початкового розміру: S
justinl

1

Помістіть android: fillAfter = "true" у тег SET - оскільки розміщення їх у тегу анімації обмежує їх "параметрами переходу" або "під час / під час анімації параметрів". Параметри в SET застосовуватимуть перетворення, яке ви шукаєте, після завершення анімації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.