android - 在android中使用动画更改布局宽度

标签 android android-layout android-animation

我尝试通过动画更改我的 relativeLayout 宽度。我的目标是通过动画将 WRAP_CONTENT 宽度更改为 MATCH_PARENT。这是我的源代码

private void setWidthAnimation(View view, int currentHeight, int newHeight) {
    ValueAnimator slideAnimator = ValueAnimator
            .ofInt(currentHeight, newHeight)
            .setDuration(1000);
    slideAnimator.addUpdateListener(animation -> {
        Integer value = (Integer) animation.getAnimatedValue();
        view.getLayoutParams().width = value.intValue();

        view.requestLayout();
    });
    AnimatorSet set = new AnimatorSet();

    set.play(slideAnimator);
    set.setInterpolator(new BounceInterpolator());
    set.start();
    view.setBackgroundColor(Color.RED);
}

我是这样调用这个方法的

  if (isKeyBoardOpen)
            setWidthAnimation(gifEditableLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        else
            setWidthAnimation(gifEditableLayout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

但是当我运行我的应用程序时, View 的宽度发生了变化但没有动画。谁能解释我做错了什么? 谢谢

最佳答案

您的代码的主要问题是您实际上没有宽度的实际值。

如果您查看您的 setWidthAnimation() 方法,请查看它的位置:

ValueAnimator slideAnimator = ValueAnimator
        .ofInt(currentHeight, newHeight)
        .setDuration(1000);

请特别注意 currentHeightnewHeight。你知道这两个 int 变量的值是多少吗?

setWidthAnimation(gifEditableLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);

您正在使用 ViewGroup.LayoutParams.WRAP_CONTENTViewGroup.LayoutParams.MATCH_PARENT 作为宽度值。但是,这些都不是您的 View 的实际宽度。

相反,它们只是 LayoutParams 的静态常量:

  • MATCH_PARENT 是一个值为 -1 的静态 int 常量

  • WRAP_CONTENT 是一个值为-2的静态int常量

因此,您实质上是在告诉 ValueAnimator 在 1 秒的持续时间内从 -1 到 -2 或 -2 到 -1 的值进行动画处理。

此外,您只需将 LayoutParam 的宽度设置为 -1 或 -2。幸运的是,这确实实现了 View 的完成外观,因为 View 的宽度可以有 3 种可能性:

  • layoutParams.width = -1; 这与调用 FILL_PARENTMATCH_PARENT

    相同
  • layoutParams.width = -2; 这与调用 WRAP_CONTENT

  • 相同
  • layoutParams.width = ANY_OTHER_INT;这与直接将宽度设置为此值是一样的。

但是,不会发生任何动画。

这样做的原因很简单,因为 ValueAnimator 实际上不做任何动画。您可以将其更多地视为数字计数器。您已将其编码为在 1 秒的时间跨度内计算从 -1 到 -2 的 int 值。所以当它开始时,它位于 WRAP_CONTENT。下一个可能的 int 值是 -2,这是完成的值,所以它会在 1 秒后更新。一秒钟后,它更新并运行您将 View 的宽度设置为 -2 的代码。这会立即强制 View 为 MATCH_PARENT

因此,要解决此问题,您需要将真正的整数值传递给您的 setWidthAnimation() 方法。

关于android - 在android中使用动画更改布局宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54529878/

相关文章:

android - 直到 UI 更新或触摸事件才开始动画

android - 如果失败,Github 操作会拒绝操作

android - 我有一个线性布局和一个框架布局,我在框架布局中膨胀我的 fragment ,如何从 fragment 访问线性布局

android - Android L 联系人应用程序如何折叠其工具栏?

Android:对齐表单中的标签

java - 将 Date 更改为设备本地时区的字符串

android - 无法将 Kotlin 序列化添加到 Android 项目

android - 没有可用于离线模式的 androidx.databinding :databinding-compiler:3. 4.2 的缓存版本

java - 在循环中创建独特的延迟后运行