android - transiciones - Fragmento de transición estándar sin animación
transicion de actividades android studio (6)
Estoy usando la biblioteca de compatibilidad de Android v4 para desarrollar una interfaz de usuario de tableta usando fragmentos específicamente para dispositivos Android 2.2 y posteriores.
Todo funciona como debería, excepto que no puedo hacer que funcionen las animaciones, ni siquiera las animaciones estándar.
Código:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ABCFragment abcFragment = new ABCFragment();
ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);
ft.addToBackStack(null);
ft.commit();
En lugar de usar una animación de tránsito, el fragmento se congela durante aproximadamente un segundo y lo justo desaparece y aparece el nuevo.
Utilizando:
ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
tampoco funciona
XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp"
android:id="@+id/LinearLayout01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="bottom">
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>
Leí que la animación personalizada se había roto en la biblioteca de compatibilidad, pero nadie parece tener problemas con las transiciones estándar. He probado esto en un 3.2.1 Motorola Xoom, un 2.3 Galaxy Tab 7 ", un emulador 2.2 e incluso en un HTC G2 con 2.3.4.
¿Qué podría estar mal aquí?
Agregué el soporte de NineOldAndroids a la biblioteca de soporte de Google. Ver http://www.github.com/kedzie/Support_v4_NineOldAndroids para más detalles. Permite usar las animaciones de propiedades para transiciones de fragmentos, PageTransformers y algunas otras cosas.
Debe llamar a setCustomAnimations
antes de agregar el fragmento. Esto permite agregar múltiples fragmentos con diferentes animaciones.
Espero que esto ayude a alguien. Los documentos de la API dicen que use objectAnimator para animaciones de fragmentos, pero incluso con el paquete de compatibilidad más reciente, ObjectAnimator in xml no fue aceptado por el compilador.
Esto funciona para mí:
Para Android 3.0 o superior: declara xml objectAnimator en la carpeta res / animator.
Con el paquete de compatibilidad por menos de 3.0: declara la animación xml en la carpeta res / anim.
Finalmente conseguí que esto funcione después de mucho ensayo y error.
En primer lugar, obtener la última ACL, solucionó las animaciones personalizadas, y aunque este no era mi problema exacto, una vez que funcionó, terminé utilizándolos en lugar de las transiciones estándar.
En este momento estoy usando:
ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out);
La clave para hacerlo funcionar tanto en Android 2.1, 2.2 y 2.3, como en Android 3.0+ era hacer lo siguiente:
- Asegúrate de estar usando SOLO la API disponible para el NIVEL DE API más bajo que deseas admitir (en mi caso 2.1).
- Compila con Android 3.0.
- En el archivo de manifiesto, configure
android:hardwareAccelerated="true"
dentro de la etiqueta de su aplicación.
Las animaciones de fragmentos ahora funcionan en todos los dispositivos. Si no establece la información adicional en la etiqueta de la aplicación, la animación ocurrirá, pero de una manera muy muy agitada, haciendo que parezca que no sucedió en absoluto.
¡Espero que esto ayude a alguien en el futuro!
Como nota, hay algunas herramientas de comprobación de API por lo que está seguro de que no está utilizando ninguna API que no esté disponible para usted. Prefiero trabajar en 2.1, por lo que el IDE no muestra nada que no pueda usar; una vez que tengo el código estable, vuelvo a compilar en 3.0
Intente obtener la ACL más reciente nuevamente, la arreglaron: http://code.google.com/p/android/issues/detail?id=15623#c19
También noté que para setCustomAnimations, debe configurarse antes de las llamadas de transacción como replace para que surtan efecto.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);
ft.replace(android.R.id.content, newFrag);
ft.addToBackStack(null);
ft.commit();
para realizar la animación top_to_bottom para el fragmento,
sigue lo mismo para hacer de arriba a abajo
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.top_to_bottom_fragment,
android.R.animator.fade_out); ft.replace(R.id.simple_fragment,
fragment);
ft.commit();
top_to_bottom_fragment.xml
<objectAnimator android:duration="400" android:valueFrom="-800"
android:valueTo="0" android:propertyName="y"
android:valueType="floatType"
xmlns:android="http://schemas.android.com/apk/res/android" />
donde valueFrom="-800"
indica la parte inferior de la distribución de su fragmento.