I have an Activity with a FloatingActionButton. When I press the FAB, an AlertDialog is shown. I want to animate its appearance by using something like reveal effect or curved motion from Android's Material Design. The documentation only has an example for changing visibility of existing views.
How can I achieve that for an AlertDialog?
According to material design documentation, “A dialog is a type of modal window that appears in front of app content to provide critical information or ask for a decision. Dialogs disable all app functionality when they appear, and remain on screen until confirmed, dismissed, or a required action has been taken”
Creating a full-screen dialog cannot be done by the showDialog method. Instead, use the showGeneralDialog method. In the pageBuilder , you should specify your dialog widget implementation. As a first widget, you can specify the SizedBox.
Dialogs should contain a maximum of two actions. Rather than adding a third action, an inline expansion can display more information.
I did something similar by calling the dialog's setOnShowListener before I show the dialog. I still need to refine the animation, but it is a start:
dialogToAnimate.setOnShowListener(new OnShowListener() {
@Override public void onShow(DialogInterface dialog) {
// Remember that ViewAnimationUtils will not work until API 21.
final View view = dialogToAnimate.getWindow().getDecorView();
final int centerX = view.getWidth() / 2;
final int centerY = view.getHeight() / 2;
// TODO Get startRadius from FAB
// TODO Also translate animate FAB to center of screen?
float startRadius = 20;
float endRadius = view.getHeight();
Animator animator = ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius);
animator.setDuration(1000);
animator.start();
}
});
If you have a custom view (defined in a XML) you can try this:
AlertDialog a = new AlertDialog.Builder(this)...blablabla;
View v = a.findViewById(R.layout.example);
// get the center for the clipping circle
int cx = (v.getLeft() + v.getRight()) / 2;
int cy = (v.getTop() + v.getBottom()) / 2;
// get the final radius for the clipping circle
int finalRadius = Math.max(v.getWidth(), v.getHeight());
// create the animator for this view (the start radius is zero)
Animator anim = ViewAnimationUtils.createCircularReveal(v, cx, cy, 0, finalRadius);
// make the view visible and start the animation
v.setVisibility(View.VISIBLE);
anim.start();
To hide it using the reverse animation:
View v = <yourAlertDialog>.findViewById(R.layout.example);
// get the center for the clipping circle
int cx = (v.getLeft() + v.getRight()) / 2;
int cy = (v.getTop() + v.getBottom()) / 2;
// get the initial radius for the clipping circle
int initialRadius = v.getWidth();
// create the animation (the final radius is zero)
Animator anim = ViewAnimationUtils.createCircularReveal(v, cx, cy, initialRadius, 0);
// make the view invisible when the animation is done
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
v.setVisibility(View.INVISIBLE);
}
});
// start the animation
anim.start();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With