当前位置: 首页 > 知识库问答 >
问题:

Android translate动画在设置动画时立即需要全高

范哲
2023-03-14

因此,假设您有一个父相对布局,其高度设置为“wrap\u content”。此布局中有另一个默认隐藏的布局。我是这样揭示的:

view.startAnimation(AnimationUtils.loadAnimation(context, R.anim.translate_in));
view.setVisibility(View.VISIBLE);  

这是相应的anim文件。它基本上将视图从底部移动到顶部。

 <translate
    android:duration="250"
    android:fromXDelta="0"
    android:fromYDelta="100%p"
    android:toXDelta="0"
    android:toYDelta="0"
    android:fillAfter="true"/>

我希望父视图会根据子视图的动画改变其高度。但是,当动画开始时,父视图会立即向上移动,而子视图仍在动画中。感觉就像在动画完成之前调用了setVisual。

所以要解决这个问题,我会将孩子的高度从0缩放到100%,但是我不想要缩放,而是要平移效果。

有没有办法解决这个问题?

布局很简单:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:backgroundColor="@color/grey">

    <TextView/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundColor="@color/white"
        android:visibility="GONE">

        <TextView/>

     </RelativeLayout>

</RelativeLayout>

共有1个答案

时向文
2023-03-14
    final RelativeLayout parent = null;//parent relative layout
    final View child = null;//parent relative layout child

    final int initParentHeight=parent.getHeight();

    parent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            parent.getViewTreeObserver().removeOnPreDrawListener(this);

            int finalParentHeight = parent.getHeight();//get parent final height
            final ViewGroup.LayoutParams layoutParams = parent.getLayoutParams();
            ValueAnimator animator = ValueAnimator.ofInt(initParentHeight, finalParentHeight);
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    layoutParams.height = (int) animation.getAnimatedValue();
                    parent.requestLayout();//animate height change
                }
            });
            animator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;//reset parent layoutparams height to wrap_content
                    parent.requestLayout();
                }
            });
            animator.setDuration(250);
            animator.start();
            return true;
        }
    });
    child.setVisibility(View.VISIBLE);
 类似资料:
  • 我有一段代码,可以为UIImage的位置设置动画,但是过渡没有设置动画,而是位置会立即改变。我不认为这是一个代码问题,因为相同的代码在另一个项目上工作,但我无法找出其他错误。 alpha会动画,而y位置不会。我的约束如下所示 编辑:我正在使用针对8.4的Xcode-Beta 7

  • 我有一些动画,我试图转换为约束。它背后的想法是当出现错误时登录提示会反弹。 我的方法是,视图控制器上的所有内容都在bounceView中,而bounceView本身也在主视图中。 BounceView使用居中约束和前导空间约束绑定到主视图。为了使布局在设计时明确无误,还有一个前导空间和顶部空间约束。不过,这些只是占位符,在运行时被等高/宽约束替换。 没有其他约束与主视图相关联。 现在,一些细节…

  • 我想动画文本视图,但它必须一直继续动画,直到单击按钮。现在它只工作一次,如何才能实现所有时间,直到单击按钮? 动画: 主要活动: 主活动XML

  • 我在动画制作方法上有问题 我已经为GoogleMap创建了自己的CalloutBubble 在我的视图控制器中,我创建属性 然后,如果我尝试用任何方法创建calloutView,所有这些都可以很好地处理动画,但如果我用Google map方法返回视图 我的动画会立即在calloutView中运行,也会立即调用completion,然后再次调用runningLabel方法,因此它不会像必须的那样工作

  • 我有一个UIView,其中有一个UILabel作为子视图。 现在我用动画改变UIView的宽度(改变约束的常量属性)并在UIView动画中调用layoutIfNeed...( 视图正在正常调整大小,但UILabel(子视图)将字体大小更改为“结束”大小,但没有像uiview那样正确设置动画。 根据WWDC 2012会话,如果仅更改superview的常量,则子视图应设置动画。 UILabel的最小

  • 我有一个简单的动画文件: 基本上,这会将一个组件沿X轴向左滑动50 dp。我已经成功地将它附加到一个组件上,它工作得非常完美,但是当我尝试同时将它附加到多个组件上时,动画只适用于最后一个组件。 例如:我有5张牌。AI敌人从手中随机选择一张牌。但是我想动画敌人“捡”卡。这就是动画发挥作用的地方。 比如说: 这里的目标是循环阵列中的每张卡,并将其滑出X轴。但动画只出现在最后一张牌上(阵列中的第五张牌)