java - example - transition layout android
OverridePendingTransition para actividades deslizantes dentro y fuera sin problemas (4)
Estoy teniendo problemas para averiguar cómo deslizar actividades dentro y fuera con solo presionar un botón. Lo que quiero es que el usuario presione un botón y luego la pantalla se deslice. Lo que quiero es que la primera actividad (la que tiene el botón) se deslice hacia la izquierda mientras que la nueva segunda actividad se desliza desde la derecha.
Con el siguiente código, cuando se hace clic en el botón, la primera actividad se desliza hacia la derecha cuando quiero que se deslice hacia la izquierda. Luego, cuando termina de deslizarse, todo lo que queda es una pantalla en negro durante una fracción de segundo y luego aparece la segunda actividad y no se desliza.
Así que la primera actividad es deslizar la dirección incorrecta y la siguiente actividad aparece en lugar de deslizarse. ¿Qué estoy haciendo mal? Me está costando entender los archivos XML, por lo que escuchar es el código para todo lo que aparece a continuación.
Primera actividad
@Override
public void onCreate(Bundle savedInstanceState) {
playBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainMenu.this, Levels.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_from_right, R.anim.exit_out_left);
}
});
2ª actividad
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.levels);
overridePendingTransition(R.anim.enter_from_left, R.anim.exit_out_right);
Así que estoy pensando que algunos de mis archivos XML pueden ser incorrectos. Aquí están.
enter_from_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="100%"
android:toXDelta="0%" >
</translate>
</set>
enter_from_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="-100%"
android:toXDelta="0%" >
</translate>
</set>
exit_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="0%"
android:toXDelta="-100%" >
</translate>
</set>
exit_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="0%"
android:toXDelta="100%" >
</translate>
</set>
EDITAR Al eliminar el overridePendingTransition()
de la segunda actividad, se hizo que la primera actividad se deslice hacia la izquierda, que es lo que quería. Pero, cuando la primera actividad se aleja, aún está revelando una pantalla negra en lugar de que la segunda actividad se deslice desde la derecha.
Cambie de fromXDelta
a -100%
de enter_from_left
y fromXDelta
a 100%
de enter_from_right
en su código, esto le dará una animación de deslizamiento correcta.
En lugar de anular la animación tanto en startActivity()
como en las nuevas actividades onCreate()
, solo tiene que anular la animación justo después de la llamada a startActivity()
.
Los dos int
s que proporciona overridePendingTransition(int enterAnim, int exitAnim)
corresponden a las dos animaciones: eliminar la Activity
y agregar la nueva.
Para su segunda pregunta, creo que tiene el conjunto deXDelta equivocado, el -100% debería estar completamente fuera del lado izquierdo de la pantalla, no del derecho, por lo que cambiarlo al 100% debería solucionarlo.
Hay un error no solo en la animación enter_from_right, que debería tener un fromXDelta de 100% en lugar de -100%, sino que incluso en la animación enter_from_left, que debería ser una fx de fromXDelta de -100% en lugar de 100%.
Aclamaciones,
mira mi esencia, funciona perfectamente
1. Reemplace startActivity''s startActivity y finish
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.from_left_in, R.anim.from_right_out);
}
2.from_left_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
3.from_right_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p"
android:toXDelta="0" android:interpolator="@android:interpolator/accelerate_decelerate"
android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
4.from_left_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
5.from_right_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:toXDelta="100%p"
android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
gist link: https://gist.github.com/JagieChen/f5cc44bf663f3722bd19097be47ccf9b