Как увеличить высоту макета с помощью анимации?

Я не мог найти хороший пример того, как это сделать.

У меня есть RelativeLayout с высотой x.

Я хочу добавить кнопку, которая увеличивает высоту до высоты x + y.

Может ли кто-нибудь назвать меня хорошим примером того, как это сделать программно?

Solutions Collecting From Web of "Как увеличить высоту макета с помощью анимации?"

Ниже приведен новый отредактированный ответ, как показано ниже. Но здесь вам нужно знать точную новую высоту.

public class LayoutAnimationActivity extends Activity { RelativeLayout ril1; Button btn; int initialHeight; int actualHeight; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main2); ril1=(RelativeLayout)findViewById(R.id.relativeLayout1); btn=new Button(this); btn.setWidth(100); btn.setHeight(200); btn.setText("Button"); actualHeight=210; Ani a=new Ani(); a.setDuration(2000); ril1.startAnimation(a); } class Ani extends Animation { public Ani() { } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newHeight; newHeight = (int)(initialHeight * interpolatedTime); ril1.removeAllViews(); btn.setWidth(100); btn.setHeight(300); btn.setText("as"); ril1.addView(btn); ril1.getLayoutParams().height = newHeight; ril1.requestLayout(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); initialHeight = actualHeight; } @Override public boolean willChangeBounds() { return true; } }; } 

Вы отметили самое близкое решение. Это точное решение. У меня такая же проблема. Надеюсь, этот ответ поможет другим.

ResizeAnimation

 ResizeAnimation resizeAnimation = new ResizeAnimation( view, targetHeight, startHeight ); resizeAnimation.setDuration(duration); view.startAnimation(resizeAnimation); 

Класс ResizeAnimation должен выглядеть следующим образом:

 public class ResizeAnimation extends Animation { final int targetHeight; View view; int startHeight; public ResizeAnimation(View view, int targetHeight, int startHeight) { this.view = view; this.targetHeight = targetHeight; this.startHeight = startHeight; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { int newHeight = (int) (startHeight + targetHeight * interpolatedTime); //to support decent animation, change new heigt as Nico S. recommended in comments //int newHeight = (int) (startHeight+(targetHeight - startHeight) * interpolatedTime); view.getLayoutParams().height = newHeight; view.requestLayout(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); } @Override public boolean willChangeBounds() { return true; } } 

Вам нужна масштабная анимация, вот официальная документация

Это в коде

 private void animate() { ImageView imageView = (ImageView) findViewById(R.id.ImageView01); ScaleAnimation scale = new ScaleAnimation((float)1.0, (float)1.5, (float)1.0, (float)1.5); scale.setFillAfter(true); scale.setDuration(500); imageView.startAnimation(scale); } 

Два простых способа сделать это без класса Animation :

1) Установите android:animateLayoutChanges="true" в вашем файле макета xml

2) Использование аниматора ViewProperty

 layout.setPivot(0); layout.animate().scaleY(scaleFactor).setDuration(500); 

Сводка указывает, где масштабироваться, по умолчанию находится посередине, что по моему опыту почти никогда не то, что вы хотите. Продолжительность необязательна (по умолчанию = 1000).

 final Button button1 = (Button) view.findViewById(R.id.button); final CollapseAnimator animator = new CollapseAnimator(topLayout); final ViewTreeObserver.OnGlobalLayoutListener listener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int mHeight = button1.getMeasuredHeight(); KLog.i("onGlobalLayout() mHeight:" + mHeight); animator.setValues(mHeight*2, mHeight); } }; button1.getViewTreeObserver().addOnGlobalLayoutListener(listener); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { view.post(new Runnable() { @Override public void run() { button1.getViewTreeObserver().removeOnGlobalLayoutListener(listener); animator.collapse(); } }); } }); 

И класс

 public class CollapseAnimator { private View view; private boolean collapse=true; private int duation=300; private int destHeight=300; private ValueAnimator animator; private int originHeight=0; private int from=0; private int to=0; public CollapseAnimator(View view ) { this.view = view; } public void setValues(int destHeight,int originHeight){ this.destHeight = destHeight; this.originHeight=originHeight; from=originHeight; to=originHeight; } public void collapse(){ from=to; if(collapse){ to=destHeight; collapse=false; }else{ to=originHeight; collapse=true; } KLog.i("from:" + from+",to:"+to); animator = ValueAnimator.ofInt(from, to); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.height = val; view.setLayoutParams(layoutParams); } }); animator.setDuration(duation); animator.start(); } }