2017-11-03 6 views
0

View을 위에서 아래로 확장하는 애니메이션을 만들려고합니다. 이처럼Nine-Patch를 배경으로 확대하여 애니메이션보기를 확대합니다.

이 정상적인 Bitmap처럼 나인 - 패치를 뻗어 있기 때문에

I가 0에 ScaleAnimationpivotY 설정을 사용할 수 없습니다. 내 View의 높이를 수정해야합니다.


내 현재 솔루션 : (test가보기 참조입니다)

ValueAnimator anim = ValueAnimator.ofInt(test.getMeasuredHeight(), 800); 
anim.setInterpolator(new FastOutSlowInInterpolator()); 
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     ViewGroup.LayoutParams params = test.getLayoutParams(); 
     params.height = (int) animation.getAnimatedValue(); 
     test.setLayoutParams(params); 
    } 
}); 
anim.setDuration(250).start(); 

이 완벽하게 작동하지만, 양쪽에보기 확장 :

아는 사람 있습니까? 그런 애니메이션을 만드는 방법? 도움을 주시면 감사하겠습니다.

답변

1

해결책은보기가 성장하지 않습니다 구현을 유지하지만, 위의 요소를함으로써 아래로 확장을 제한하는 것입니다 :

예 : 컨테이너가

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout 
     ... 
     android:layout_height="100dp"/> //assuming your view starts 100dps from top 

    <YourView 
     ... 
     .../> 

</LinearLayout> 

입니다

때문에 LinearLayout과 첫 번째보기 (FrameLayout)는 높이가 100dp이고 확장하려는보기 위에 있으면 동일한 계층 구조의 요소와 겹칠 수 없으므로 높이가 확장되지 않으므로 확장됩니다.

또한 작동합니다. RelativeLayout을 YourView에 추가하여 YourView가 확장되지 않는다고 보증하는 경우에도

+0

감사를 확장! 이 솔루션은 ConstraintLayout에서도 작동합니다. – Tacoboy

+0

도움이 된 것을 기쁘게 생각합니다. 명백하게 문제를 해결 한 경우 대답을 올바른 것으로 표시하십시오. – Ricardo

0

Y 축의 초기 위치를 유지하는 추가 변수를 추가하십시오.

public void expandTop(final View test) { final float bottomAnchor = test.getY() + test.getHeight(); final ValueAnimator anim = ValueAnimator.ofInt(test.getMeasuredHeight(), 800); anim.setInterpolator(new FastOutSlowInInterpolator()); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { ViewGroup.LayoutParams params = test.getLayoutParams(); params.height = (int) animation.getAnimatedValue(); test.setY(bottomAnchor - (int) animation.getAnimatedValue()); test.setLayoutParams(params); } }); anim.setDuration(2500).start(); } 

최고 expandBottom에게

public void expandBottom(final View test) { 
    final float topAnchor = test.getY(); 
    final ValueAnimator anim = ValueAnimator.ofInt(test.getMeasuredHeight(), 800); 

    anim.setInterpolator(new FastOutSlowInInterpolator()); 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      ViewGroup.LayoutParams params = test.getLayoutParams(); 
      params.height = (int) animation.getAnimatedValue(); 
      test.setY(topAnchor); 
      test.setLayoutParams(params); 
     } 
    }); 
    anim.setDuration(2500).start(); 
}