android - tipos - Cambie la transición de entrada/salida de DialogFragment justo antes de salir.
tipos de dialogos en android studio (5)
Tengo un DialogFragment y configuro la animación para entrar / salir en el método onActivityCreated como se muestra a continuación
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
getDialog().getWindow()
.getAttributes().windowAnimations = R.style.DialogAnimation;
}
Mis archivos de estilo DialogAnimation son los siguientes
<style name="DialogAnimation">
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Esto funciona para mí ahora ...
Ahora mi problema es que quiero tener dos animaciones de salida diferentes, una para cuando se hace clic en el botón Aceptar y otra para el botón cancelar. Así que lo que hice fue intentar cambiar la transición antes de descartar pero no funcionó ... cualquier solución sobre cómo se puede lograr ... Esto es lo que probé.
@Override
public void onClick(View v) {
getDialog().getWindow()
.getAttributes().windowAnimations = R.style.DialogAnimation2;
this.dismiss();
}
Creo que el mejor enfoque es llamar a las diferentes animaciones en Button click. Por lo tanto, tendría algo similar a lo siguiente:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button OkButton = (Button) findViewById(R.id.btnOk);
Button CancelButton = (Button) findViewById(R.id.btnCancel);
OkButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
}
});
return true;
CancelButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation2;
}
});
return true;
}
Si yo fuera usted, también usaría las convenciones de denominación correctas para futuras referencias. Por ejemplo, establecer DialogAnimation en OkAnimation y DialogAnimation2 en CancelAnimation.
Inicio esto ayuda :)
Debes establecer un tema para tu diálogo base
Digamos :-
public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Set a theme on the dialog builder constructor!
AlertDialog.Builder builder =
new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );
builder
.setTitle( "Your title" )
.setMessage( "Your message" )
.setPositiveButton( "OK" , new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
}
Entonces solo necesita definir el tema que incluirá su animación deseada. En styles.xml agrega tu tema personalizado:
<style name="MyCustomTheme" parent="@android:style/Theme.Panel">
<item name="android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>
<style name="MyAnimation.Window" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/anim_in</item>
<item name="android:windowExitAnimation">@anim/anim_out</item>
</style>
refiera this
Puede configurar una animación hacia arriba para el fragmento de diálogo.
// deslice hacia arriba la animación
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="0" />
</set>
// diapositiva dowm animación
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="0%p"
android:interpolator="@android:anim/accelerate_interpolator"
android:toYDelta="100%p" />
</set>
// estilo
<style name="DialogAnimation">
<item name="android:windowEnterAnimation">@anim/slide_up</item>
<item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
// Fragmento de diálogo interno
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
getDialog().getWindow()
.getAttributes().windowAnimations = R.style.DialogAnimation;
}
Puede hacerlo dentro de su DialogFragment, sin cambiar
getDialog().getWindow()
.getAttributes().windowAnimations
Debería animar la "vista de decoración" en onStart y onClick.
Este es el código cortado:
Crear diálogo primero
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Hello from animated dialog :)")
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//we have to add button here and then override it''s click in onStart
}
}
)
.setCancelable(false)
.create();
}
Luego anula el método onStart
@Override
public void onStart() {
super.onStart();
AlertDialog dialog = (AlertDialog)getDialog();
final View decorView = getDialog()
.getWindow()
.getDecorView();
ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f));
scaleDown.setDuration(2000);
scaleDown.start();
Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
positiveButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
final View decorView = getDialog()
.getWindow()
.getDecorView();
ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f));
scaleDown.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
dismiss();
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
scaleDown.setDuration(2000);
scaleDown.start();
}
});
}
Aquí está la animación de resultados.
Y si elimina las propiedades de escala de mi código, obtendrá solo animación alfa. Exactamente como quisieras.
Elimina esto:
PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
Una forma simple de hacer lo que quieras es usar oyentes de animación como.
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
// dismiss your dialog in here and it will work
}
});
Comience la animación en su método onclick y cierre el diálogo en el métodoAnimationEnd (). Puede que tenga que hacer objetos de borrado e iniciarlos manualmente con el método startAnimation (animación) de View.