Анимация свойств Android: как увеличить высоту просмотра?
Как увеличить высоту просмотра с помощью Property Animations в Android?
ObjectAnimator a = ObjectAnimator.ofFloat(viewToIncreaseHeight, "translationY", -100);
a.setInterpolator(new AccelerateDecelerateInterpolator());
a.setDuration(1000);
a.start();
Перевод Y фактически перемещает вид, а не увеличивает высоту. Как я могу увеличить высоту вида?
8 ответов
ValueAnimator anim = ValueAnimator.ofInt(viewToIncreaseHeight.getMeasuredHeight(), -100);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int val = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = viewToIncreaseHeight.getLayoutParams();
layoutParams.height = val;
viewToIncreaseHeight.setLayoutParams(layoutParams);
}
});
anim.setDuration(DURATION);
anim.start();
Вы можете использовать ViewPropertyAnimator, который может сэкономить вам несколько строк кода:
yourView.animate().scaleY(-100f).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(1000);
это должно быть все, что вам нужно, обязательно проверьте документацию и все доступные методы для ViewPropertyAnimator.
Это не прямой ответ на этот вопрос. Однако может кому-то помочь.
Иногда мы хотим увеличить / уменьшить высоту представления, потому что некоторые из его дочерних элементов добавляются / удаляются (или просто становятся видимыми / исчезающими).
В таких случаях вы действительно можете использовать анимацию Android по умолчанию. Как упоминалось в других ответах, вы можете установить через:
<LinearLayout
...
android:animateLayoutChanges="true"
.../>
Или на Java:
linearLayout.setLayoutTransition(new LayoutTransition());
Если вы создали собственное представление:
public StickerPickerView(final Context context, final AttributeSet attrs,
final int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutTransition(new LayoutTransition());
}
Для меня это было довольно удовлетворительно, но я только что тестировал последние API. Это автоматически добавит постепенное появление / исчезновение, когда ваш вид станет видимым. Он также будет анимировать высоту / ширину вашего представления при тех же изменениях (например, когда вы меняете видимость одного из дочерних представлений и т. Д.).
Так что рекомендую хотя бы попробовать.
Используйте этот метод в котлине:
private fun increaseViewSize(view: View) {
val valueAnimator = ValueAnimator.ofInt(view.measuredHeight, view.measuredHeight+20)
valueAnimator.duration = 500L
valueAnimator.addUpdateListener {
val animatedValue = valueAnimator.animatedValue as Int
val layoutParams = view.layoutParams
layoutParams.height = animatedValue
view.layoutParams = layoutParams
}
valueAnimator.start()
}
fun View.animateHeightFromTo(initialHeight: Int, finalHeight: Int) {
val animator = ValueAnimator.ofInt(initialHeight, finalHeight)
animator.duration = 250
animator.addUpdateListener {
val value = it.animatedValue as Int
val lp = this.layoutParams
lp.height = value
this.layoutParams = lp
isVisible = value != 0
}
animator.start()
}
Настройка видимости мне удобна, но, возможно, вам это не нужно.
За kotlin
вы можете использовать этот метод
private fun increaseViewSize(view: View, increaseValue: Int) {
val valueAnimator =
ValueAnimator.ofInt(view.measuredHeight, view.measuredHeight + increaseValue)
valueAnimator.duration = 500L
valueAnimator.addUpdateListener {
val animatedValue = valueAnimator.animatedValue as Int
val layoutParams = view.layoutParams
layoutParams.height = animatedValue
view.layoutParams = layoutParams
}
valueAnimator.start()
}
Это увеличит размер представления, как определено в параметре
на основе ответа @Minion
Вот мой код для анимации прокрутки элемента в центре экрана внутри recycleView
// Scrolling with animation
val valueAnimator = ValueAnimator.ofInt(getWidth() / 2)
valueAnimator.duration = 250L
valueAnimator.addUpdateListener {
val animatedValue = valueAnimator.animatedValue as Int
(layoutManager as LinearLayoutManager).scrollToPositionWithOffset(itemToScroll, animatedValue)
}
valueAnimator.start()
// End of scrolling with animation
Обратите внимание, что это немного похоже на UIView.animate в Swift, но с большим усложнением
Это довольно просто, как вы можете видеть ниже.
<LinearLayout android:id="@+id/container"
android:animateLayoutChanges="true"
.../>
Более подробная информация ниже: