Я вижу, что этот вопрос стал популярным, поэтому я публикую свое реальное решение. Основным преимуществом является то, что вам не нужно знать расширенную высоту, чтобы применить анимацию, и как только представление расширяется, оно изменяет высоту при изменении содержимого. Это прекрасно работает для меня.
public static void expand(final View v) {
int matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec(((View) v.getParent()).getWidth(), View.MeasureSpec.EXACTLY);
int wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
v.measure(matchParentMeasureSpec, wrapContentMeasureSpec);
final int targetHeight = v.getMeasuredHeight();
// Older versions of android (pre API 21) cancel animations for views with a height of 0.
v.getLayoutParams().height = 1;
v.setVisibility(View.VISIBLE);
Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? LayoutParams.WRAP_CONTENT
: (int)(targetHeight * interpolatedTime);
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// Expansion speed of 1dp/ms
a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
public static void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// Collapse speed of 1dp/ms
a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
Как упомянуто @Jefferson в комментариях, вы можете получить более плавную анимацию, изменив продолжительность (и, следовательно, скорость) анимации. В настоящее время он установлен на скорости 1 дп / мс
a.setDuration(((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density)) * 4)
v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
иv.getLayoutParams().height = interpolatedTime == 1 ? targetHeight : (int)(targetHeight * interpolatedTime);
это сработало для меня!Я пытался сделать то, что я считаю очень похожей анимацией, и нашел элегантное решение. Этот код предполагает, что вы всегда идете от 0-> h или h-> 0 (h - максимальная высота). Три параметра конструктора: view = представление, которое нужно анимировать (в моем случае, веб-просмотр), targetHeight = максимальная высота представления и down = логическое значение, которое указывает направление (true = расширение, false = свертывание).
источник
Я наткнулся на ту же проблему сегодня, и я думаю, что реальное решение этого вопроса заключается в следующем
Вам нужно будет установить это свойство для всех верхних макетов, которые участвуют в сдвиге. Если вы теперь установите видимость одного макета на GONE, другой займет пространство, поскольку исчезающий освобождает его. Будет анимация по умолчанию, которая будет своего рода "исчезать", но я думаю, что вы можете изменить это - но последний, который я пока не тестировал.
источник
Я взял @LenaYan «s решение , что не работает должным образом для меня ( потому что он был преобразуя вид на вид на 0 высоты перед разрушением и / или расширения ) и внес некоторые изменения.
Теперь он отлично работает , взяв предыдущую высоту просмотра и начав расширяться с этим размером. Рушится то же самое.
Вы можете просто скопировать и вставить код ниже:
Применение:
Достаточно просто!
Спасибо LenaYan за исходный код!
источник
Альтернативой является использование масштабной анимации со следующими масштабными коэффициентами для расширения:
и для разрушения:
источник
@Tom Esterez's ответ , но обновляется , чтобы использовать view.measure () правильно на Android getMeasuredHeight возвращает неправильные значения!
источник
Хорошо, я только что нашел ОЧЕНЬ уродливое решение:
Не стесняйтесь предложить лучшее решение!
источник
View.onMeause(widthMeasureSpec, heightMeasureSpec)
вызове произошла небольшая ошибка , поэтому спецификации ширины и высоты следует поменять местами.источник
Если вы не хотите, чтобы развернуть или свернуть полностью - вот простая анимация высоты -
Применение:
источник
Я адаптировал принятый в настоящее время ответ Тома Эстереза , который работал, но имел изменчивую и не очень плавную анимацию. Мое решение в основном заменяет на
Animation
aValueAnimator
, который может быть снабженInterpolator
вашим выбором для достижения различных эффектов, таких как перерегулирование, отскок, ускорение и т. Д.Это решение прекрасно работает с видами, которые имеют динамическую высоту (т.е. используют
WRAP_CONTENT
), так как сначала измеряют фактическую требуемую высоту, а затем анимируют до этой высоты.Вы тогда просто позвоните
expand( myView );
илиcollapse( myView );
.источник
v.measure()
и теперь он работает отлично. Спасибо!Использование функций расширения Kotlin - это проверенный и самый короткий ответ
Просто вызовите animateVisibility (разверните / сверните) в любом представлении.
источник
Добавляя к превосходному ответу Тома Эстереза и превосходному обновлению Эрика Б. , я решил опубликовать свой собственный дубль, сведя методы расширения и контракта в один. Таким образом, вы могли бы, например, иметь действие, как это ...
... который вызывает метод ниже и позволяет ему выяснить, что делать после каждого onClick () ...
источник
Я хотел бы добавить кое-что к очень полезному ответу выше . Если вы не знаете, какую высоту вы получите, поскольку ваши представления .getHeight () возвращает 0, вы можете сделать следующее, чтобы получить высоту:
Где DUMMY_HIGH_DIMENSIONS - это ширина / высота (в пикселях), в которой ваш вид ограничен ... иметь это огромное число разумно, если представление инкапсулировано с ScrollView.
источник
Это фрагмент, который я использовал для изменения ширины представления (LinearLayout) с анимацией.
Код должен расширяться или уменьшаться в зависимости от целевого размера. Если вы хотите ширину fill_parent, вам нужно будет передать родительский .getMeasuredWidth в качестве целевой ширины, устанавливая флаг в значение true.
Надеюсь, это поможет некоторым из вас.
}
источник
resizeAnim.start()
. Также пробовал с и безsetFillAfter(true)
.startAnimation(resizeAnim)
на вид.Для плавной анимации используйте Handler с методом run ..... и наслаждайтесь анимацией Expand / Collapse
И позвоните, используя этот код:
Другое решение:
источник
комбинированные решения от @Tom Esterez и @Geraldo Neto
источник
Да, я согласен с вышеуказанными комментариями. И действительно, кажется, что правильная (или, по крайней мере, самая простая?) Вещь, которую нужно сделать, это указать (в XML) начальную высоту макета «0px» - и затем вы можете передать другой аргумент для «toHeight» ( то есть "конечная высота") для конструктора вашего пользовательского подкласса Animation, например, в приведенном выше примере это будет выглядеть примерно так:
В любом случае, надеюсь, это поможет! :)
источник
Вот мое решение. Я думаю, что это проще. Это только расширяет представление, но может быть легко расширено.
источник
Я думаю, что самое простое решение - установить
android:animateLayoutChanges="true"
свой вид,LinearLayout
а затем просто показать / скрыть представление, установив его видимость. Работает как шарм, но у вас нет контроля над продолжительностью анимацииисточник
Ты на правильном пути. Убедитесь, что у v1 задана высота макета, равная нулю, перед началом анимации. Вы хотите инициализировать настройки так, чтобы они выглядели как первый кадр анимации перед началом анимации.
источник
Это было мое решение, мое
ImageView
растет от100%
к200%
и вернуться к своему первоначальному размеру, используя две анимационные файлы внутриres/anim/
папкиanim_grow.xml
anim_shrink.xml
Отправить
ImageView
мой методsetAnimationGrowShrink()
setAnimationGrowShrink()
метод:источник
Это правильное рабочее решение, я проверил его:
Exapnd:
Collapse:
Значение аниматора:
Представление v - это анимированное представление, PARENT_VIEW - представление контейнера, содержащее это представление.
источник
Это действительно просто с droidQuery . Для начала рассмотрим этот макет:
Мы можем анимировать высоту до желаемого значения, скажем,
100dp
используя следующий код:Тогда используйте,
droidQuery
чтобы оживить. Самый простой способ с этим:Чтобы сделать анимацию более привлекательной, рассмотрите возможность добавления замедления:
Вы также можете изменить продолжительность
AnimationOptions
использованияduration()
метода или обработать то, что происходит, когда анимация заканчивается. Для сложного примера попробуйте:источник
Лучшее решение для развёртывания / свёртывания представлений:
источник
onCheckedChanged
.Вы можете использовать ViewPropertyAnimator с легким поворотом. Чтобы свернуть, масштабируйте вид до высоты 1 пикселя, затем скройте его. Чтобы развернуть, покажите его, а затем разверните до его высоты.
Сводка показывает, где масштабировать, по умолчанию в середине. Продолжительность не является обязательной (по умолчанию = 1000). Вы также можете установить интерполятор для использования, как
.setInterpolator(new AccelerateDecelerateInterpolator())
источник
Я создал версию, в которой вам не нужно указывать высоту макета, поэтому его намного проще и понятнее использовать. Решение состоит в том, чтобы получить высоту в первом кадре анимации (она доступна в тот момент, по крайней мере, во время моих тестов). Таким образом, вы можете предоставить View с произвольной высотой и нижним полем.
В конструкторе также есть один небольшой взлом - нижнее поле установлено на -10000, так что представление остается скрытым до преобразования (предотвращает мерцание).
источник
Используйте ValueAnimator:
источник
mainView.getLayoutParams().height = height
.источник
Класс можно вызвать следующим образом
источник
Основываясь на решениях @Tom Esterez и @Seth Nelson (top 2), я смоделировал их. Как и оригинальные решения, это не зависит от параметров разработчика (настроек анимации).
источник