我尝试通过动画更改我的 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);
请特别注意 currentHeight 和 newHeight。你知道这两个 int 变量的值是多少吗?
setWidthAnimation(gifEditableLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
您正在使用 ViewGroup.LayoutParams.WRAP_CONTENT
和 ViewGroup.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_PARENT
或MATCH_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/