Анимация свойств 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"
.../>

Более подробная информация ниже:

https://developer.android.com/training/animation/layout

Другие вопросы по тегам