Intereting Posts
Проверьте, установлено ли приложение – Android Менеджер AVD не обнаружит мой телефон HTC Hero как виртуальное устройство Соединения и блокировка SQLite Gradle Warning "не указано, зависит от библиотек, но является банкой" при компиляции модуля android в пользовательском модуле java-библиотеки Как получить доступ к контактам в моей программе Android «Дублируйте файл lib, скопированный в APK-META-INF / license.txt» в Android Studio Проблемы с https (нет сертификата партнера) в android Могу ли я подключить базу данных Apache Derby с Android-приложением? Я не могу найти файл adb_usb.ini в папке .android? Android DDMS v22.0.1 не может генерировать systrace, используя Droid Razor 4.1.2 Socialauth android ResourceNotFound Как узнать, что приложение установлено из игры Google или боковой загрузки? Проверьте, является ли строка числом Шаговый контроль конструкции материала Android. Как я могу «запустить» или «инициализировать» фрагмент из активности?

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

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

У меня есть 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(); } }