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

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

  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();