2015-07-16 4 views
6

Ich habe eine Activity mit einer FloatingActionButton. Wenn ich den FAB drücke, wird AlertDialog angezeigt. Ich möchte sein Aussehen animieren, indem ich so etwas wie "reveal effect" oder "curved motion" von Android 's Material Design verwende. Die documentation enthält nur ein Beispiel zum Ändern der Sichtbarkeit vorhandener Ansichten.Wie man einen Dialog auf Android unter Verwendung des offenbaren Effektes vom materiellen Entwurf zeigt?

Wie kann ich das für eine AlertDialog erreichen?

Antwort

2

Wenn Sie eine benutzerdefinierte Ansicht (definiert in einem XML) haben, können Sie dies versuchen:

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(); 

So blenden sie die umgekehrte Animation mit:

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(); 
+0

Was würden Sie vorschlagen, für eine ähnliche Animation für API-Ebene < 21? –

2

ich etwas tat, ähnlich von der anruf Dialog ist setOnShowListener bevor ich den Dialog zeige. Ich muss noch die Animation verfeinern, aber es ist ein Anfang:

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(); 
    } 
}); 
+0

Ich habe meine Antwort aktualisiert, um eine vorhandene API für Dialog zu verwenden. –

1

Alert-Dialog mit Wirkung für über API Reveal 21 =>

public final void customAlertDialog(final Activity mActivity) 
{ 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity); 
     final View view = LayoutInflater.from(mActivity).inflate(R.layout.alert_dialog_simple_msg,null); 
     alertDialogBuilder.setView(view); 
     final AlertDialog alertDialog = alertDialogBuilder.create(); 
     alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
     TextView tvOk= (TextView) view.findViewById(R.id.tvOk); 
     final Animator[] animHide = {null}; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
      alertDialog.show(); 
      view.post(new Runnable() { 
       @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
       @Override 
       public void run() { 
        int cx = (int)view.getWidth()/2; 
        int cy = (int) view.getHeight()/2; 
        float finalRadius = (float) Math.hypot(cx, cy); 
        Animator animVisible = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius); 
        animHide[0] = ViewAnimationUtils.createCircularReveal(view, cx, cy, finalRadius, 0); 
        animVisible.start(); 
       } 
      }); 
     } 
     tvOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
        if (animHide[0]!=null) 
        { 
         animHide[0].addListener(new AnimatorListenerAdapter() { 
          @Override 
          public void onAnimationEnd(Animator animation) { 
           super.onAnimationEnd(animation); 
           alertDialog.dismiss(); 
          } 
         }); 
         animHide[0].start(); 
        } 
        else 
        { 
         alertDialog.dismiss(); 
        } 
       } 
       else 
       { 
        alertDialog.dismiss(); 
       } 
      } 
     }); 
     alertDialog.setCancelable(false); 
    } 
Verwandte Themen