2016-04-21 103 views
0

所以想象你有一个父母相对布局,高度设置为wrap_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"/> 

我期望父视图根据子视图的动画来改变它的高度。但是,当动画开始时,父视图会立即向上移动,而子视图仍然具有动画效果。感觉像在动画完成之前调用setVisibility。

所以为了解决这个问题,我会将孩子的身高从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> 
+0

它通过“隐藏”,你的意思是'GONE',在这种情况下,父亲勾画出好像孩子是不存在的,并会听起来像最初身高为'0',但只要您将孩子设置为“可见”,父母就会包裹孩子的实际身高,并“立即向上移动”。是吗? –

+0

@MikeM。正确地 –

+0

@MikeM。布局真的没什么特别的。看我的编辑。 –

回答

2
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); 
+0

它应该返回false以便它不执行第一次绘制。 – drivfe