Анимация верхнего и нижнего размеров представления

Мне нужно сделать две вещи с целью:

  1. Переместить верхний размер в самую верхнюю часть окна
  2. Переместите нижний размер в самую нижнюю часть окна.

Короче говоря, мне нужно представление, чтобы охватить 100% родительского представления.

Перевод анимации не работал, потому что он перемещает представление, но он не увеличивает размер.

Масштабная анимация работает, но она растягивает содержимое представления, и я не хочу этого. Я хочу увеличить видимую область, а не растягивать содержимое в соответствии с новыми измерениями.

Каков правильный способ сделать это?

Это может быть легко достигнуто с помощью API переходов .

С API Transitions вы не заботитесь о написании анимации, просто говорите, что вы хотите, чтобы конечные значения были, а API переходов позаботился о создании анимаций.

Наличие этого xml в виде содержимого (вид в центре экрана):

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/view" android:layout_width="120dp" android:layout_height="80dp" android:layout_gravity="center" android:background="@color/colorAccent" /> </FrameLayout> 

В деятельности:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.item) val root = findViewById(R.id.root) as ViewGroup val view = findViewById(R.id.view) view.setOnClickListener { // After this line Transitions API would start counting the delta // and will take care of creating animations for each view in `root` TransitionManager.beginDelayedTransition(root) // By default AutoTransition would be applied, // but you can provide your transition with the second parameter // val transition = AutoTransition() // transition.duration = 2000 // TransitionManager.beginDelayedTransition(root, transition) // We are changing size of the view to match parent val params = view.layoutParams params.height = ViewGroup.LayoutParams.MATCH_PARENT params.width = ViewGroup.LayoutParams.MATCH_PARENT view.requestLayout() } } 

Вот результат:

API переходов платформы ( android.transition.TransitionManager ) доступен из API 19, но поддержка библиотек поддерживает функции до API 14 ( android.support.transition.TransitionManager ).

Мне нравится держать все как можно проще.

Поэтому мое предложение будет использовать андроидные анимационные изменения макета

Вот пример:

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" android:animationCache="true"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:background="@color/colorPrimary" android:layout_gravity="center" /> </LinearLayout> 

MainActivity.java

 public class MainActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); } @Override protected void onResume() { super.onResume(); new Handler().postDelayed(new Runnable() { @Override public void run() { View view = getWindow().getDecorView(); int height = getWindow().getDecorView().getHeight(); int width = getWindow().getDecorView().getWidth(); textView.setLayoutParams(new LinearLayout.LayoutParams(width, height)); LayoutTransition layoutTransition = ((ViewGroup) textView.getParent()).getLayoutTransition(); layoutTransition.enableTransitionType(LayoutTransition.CHANGING); } }, 2000); } } 

Вы можете попробовать использовать ValueAnimator, как показано в этом ответе: https://stackoverflow.com/a/32835417/3965050

Примечание. Я хотел написать это как комментарий, но у меня нет репутации. Это не следует рассматривать как полный ответ.

 animateLayoutChanges="true" in the parent xml 

+

 .setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

Делает трюк большую часть времени, и он не будет растягивать существующие дочерние представления

Использование ConstraintLayout с ConstrainSet должно соответствовать вашим потребностям наиболее эффективным способом.

 public class MainActivity extends AppCompatActivity { ConstraintSet mConstraintSet1 = new ConstraintSet(); // create a Constraint Set ConstraintSet mConstraintSet2 = new ConstraintSet(); // create a Constraint Set ConstraintLayout mConstraintLayout; // cache the ConstraintLayout boolean mOld = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context context = this; mConstraintSet2.clone(context, R.layout.state2); // get constraints from layout setContentView(R.layout.state1); mConstraintLayout = (ConstraintLayout) findViewById(R.id.activity_main); mConstraintSet1.clone(mConstraintLayout); // get constraints from ConstraintSet } public void foo(View view) { TransitionManager.beginDelayedTransition(mConstraintLayout); if (mOld = !mOld) { mConstraintSet1.applyTo(mConstraintLayout); // set new constraints } else { mConstraintSet2.applyTo(mConstraintLayout); // set new constraints } } } 

Источник https://developer.android.com/reference/android/support/constraint/ConstraintSet.html

Все, что вам нужно, это определить второй layout.xml с расширенными ограничениями и применить второй ConstraintSet к вашему виду или активности, когда это необходимо.

 ValueAnimator anim = ValueAnimator.ofInt(viewToIncreaseHeight.getMeasuredHeight(), -100); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = viewGroup.getLayoutParams(); layoutParams.height = val; viewGroup.setLayoutParams(layoutParams); } }); anim.setDuration(DURATION); anim.start(); 
Intereting Posts
Как синхронизировать только код андроида 2.2 froyo? Является ли OpenGL на Android аккумулятором? Исключение Http get Целевой узел не должен иметь значение null для ICS Качество пользовательской камеры Android Android: Как вы можете получить фреймбуфер (скриншот) на корневом устройстве? Как редактировать исходный код клавиатуры android os? Как назначить уникальные идентификаторы динамически созданным представлениям? Android Bitmap: конвертировать прозрачные пиксели в цвет Каковы последствия обнаружения GCM SENDER ID? Java.lang.NoClassDefFoundError: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential Google PlacePicker закрывается сразу после запуска Как передавать аудио с одного устройства Android на другое устройство Android Через Bluetooth? Понимание намерений в Android-аутентификации Закрыть строку состояния при нажатии кнопки уведомления Android: как отключить AsyncTask до того, как я вызову другой метод?