Android属性动画:如何增加视图高度?

g.r*_*ion 50 java android android-animation objectanimator viewpropertyanimator

如何使用Android中的属性动画增加视图高度?

ObjectAnimator a = ObjectAnimator.ofFloat(viewToIncreaseHeight, "translationY", -100);
a.setInterpolator(new AccelerateDecelerateInterpolator());
a.setDuration(1000);
a.start();
Run Code Online (Sandbox Code Playgroud)

translationY实际上移动视图而不是增加高度.如何增加视图的高度?

raj*_* ks 116

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(); 
Run Code Online (Sandbox Code Playgroud)

  • 非常缓慢的方法,因为将在每一帧计算更改视图。 (7认同)

A H*_*ard 18

您可以使用ViewPropertyAnimator,它可以为您节省一些代码行:

yourView.animate().scaleY(-100f).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(1000);
Run Code Online (Sandbox Code Playgroud)

应该是您所需要的,请务必查看ViewPropertyAnimator的文档和所有可用方法.

  • `scale` 将在两个方向上扩展 `view`,并拉伸它的子视图 _(如果有的话)_。__OP__ 只想为“视图”的“高度”设置动画。 (16认同)

W0r*_*0le 12

这不是对这个问题的直接回答。但是,它可能会帮助某人。

有时,我们想要增加/减少视图的高度,因为它的一些子项正在被添加/删除(或只是变得可见/消失)。

在这些情况下,您确实可以使用 Android 默认动画。正如其他答案中所述,您可以通过以下方式进行设置:

<LinearLayout
    ...
    android:animateLayoutChanges="true"
.../>
Run Code Online (Sandbox Code Playgroud)

或者在 Java 中:

linearLayout.setLayoutTransition(new LayoutTransition());
Run Code Online (Sandbox Code Playgroud)

如果您创建了自定义视图:

public StickerPickerView(final Context context, final AttributeSet attrs,
        final int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setLayoutTransition(new LayoutTransition());
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这是相当令人满意的,但我只是在最新的 API 上进行了测试。当您的视图可见时,这将自动添加淡入/淡出。当相同的更改(例如更改子视图之一的可见性等)时,它还将为视图的高度/宽度设置动画。

所以,我建议至少尝试一下。

  • 如果 ```android:animateLayoutChanges="true"``` 在嵌套视图中不起作用,那么您需要将 ```linearlayout.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)``` 添加到父布局中,该布局将是调整大小。 (2认同)

Pra*_*rma 6

在 kotlin 中使用这个方法:

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()
}
Run Code Online (Sandbox Code Playgroud)