Animar las dimensiones superior e inferior de una vista

Tengo que hacer dos cosas con una vista:

  1. Mover la dimensión superior a la parte superior de la ventana
  2. Mueva la dimensión inferior hasta la parte inferior de la ventana.

En resumen, necesito la vista para cubrir el 100% de la vista de los padres.

La animación de traducción no funcionó porque mueve la vista pero no aumenta el tamaño.

Escala de animación funciona, pero se extiende el contenido de la vista y no quiero eso. Quiero aumentar el área visible, no estirar el contenido para adaptarse a las nuevas dimensiones.

¿Cuál es la manera correcta de hacer esto?

Eso se puede lograr fácilmente con la API de Transitions .

Con Transitions API no cuidas las animaciones de escritura, solo dices lo que quieres que sean los valores finales y la API de Transitions se encargaría de construir animaciones.

Tener este xml como vista de contenido (una vista en el centro de la pantalla):

 <?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> 

En actividad:

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

Aquí está la salida:

La API de transición de la plataforma ( android.transition.TransitionManager ) está disponible desde API 19, pero las bibliotecas de soporte backport la funcionalidad hasta API 14 ( android.support.transition.TransitionManager ).

Me gusta mantener todo tan simple como puede ser.

Por lo que mi sugerencia sería utilizar un android Animación Cambios en el diseño

He aquí un ejemplo:

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

Puede probar usando ValueAnimator como se muestra en esta respuesta: https://stackoverflow.com/a/32835417/3965050

Nota: Quería escribir esto como un comentario, pero no tengo la reputación. Esto no debe considerarse como una respuesta completa.

 animateLayoutChanges="true" in the parent xml 

+

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

Hace el truco la mayoría de las veces y no estirará las vistas de los niños existentes

Usar ConstraintLayout con ConstrainSet debe coincidir con su necesidad de la manera más eficiente.

 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 } } } 

Fuente https://developer.android.com/reference/android/support/constraint/ConstraintSet.html

Todo lo que necesita es definir un segundo layout.xml con sus restricciones expandidas y aplicar el segundo ConstraintSet a su vista o actividad cuando sea necesario.

 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(); 
  • Animación de la ventana de Android junto con la vista
  • cómo cerrar un fragmento al tirar hacia arriba o hacia abajo?
  • Cómo implementar Diseño de materiales Animaciones de superficie coreográficas
  • Animado (VectorDrawable) animado mediante programación en tiempo de ejecución
  • Fragmento de la animación de transición perdida tras el cambio de configuración
  • Rotación de la vista Jerarquía 90 grados
  • Interpolador personalizado de referencia para la animación de vistas en XML
  • Actualizar la animación del elemento de menú en ActionBarSherlock
  • Animación de fondo panorámica en Android
  • Maneje adecuadamente la animación de DrawerLayout mientras navega a través del fragmento
  • Una manera fácil de hacer funcionar la animación GONE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.