Animar las dimensiones superior e inferior de una vista
Tengo que hacer dos cosas con una vista:
- Mover la dimensión superior a la parte superior de la ventana
- 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.
- ¿Cómo escalar View / ViewGroup - animar el diseño de una manera adecuada?
- Android - ¿Cómo posicionar la vista fuera de la pantalla?
- Android - TabActivity con animación de Transición
- Combinar dos animaciones en Android
- ¿Cómo crear una vista similar al área de notificación del sistema en android?
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?
- SlidingDrawer semi abierto al inicio
- Android: ¿Cómo mover un BitmapDrawable?
- Carga de la rueda giratoria de animación
- Cómo hacer una rotación de imagen suave en Android?
- RecyclerView Preguntas y Respuestas
- Dibujar en un lienzo con demora - "hacer onDraw () reducir la velocidad"
- Iniciar una nueva actividad sin animación de transición en android 1.6
- Establecer la página predeterminada de ViewPager en Android
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();
- Cómo crear movimiento / cambiar el tamaño de las animaciones en Android?
- ¿Qué sucede con Actividades / Servicios cuando el teléfono entra en modo de espera / en espera?