在BasePopup中,您可以很轻松的定制您的进场动画或者退场动画,而不需要跟普通PopupWindow那样写好xml然后再设置进来。
在BasePopup中,您可以使用Animation或者Animator来制定弹出动画或消失动画,如果同时存在想同类型的Animation和Animator,BasePopup会优先使用Animation而忽略Animator。
在BasePopup中,我们提供了Animation和Animator各四种回调方法供您设置:

Animation Animator 描述

- onCreateShowAnimation()
- onCreateShowAnimation(width,height)

- onCreateShowAnimator()
- onCreateShowAnimator(width,height)
弹窗展示动画
* 带宽高传参的方法需要BasePopup版本在2.2.2以上

- onCreateDismissAnimation()
- onCreateDismissAnimation(width,height)

- onCreateDismissAnimator()
- onCreateDismissAnimator(width,height)
弹窗消失动画
* 带宽高传参的方法需要BasePopup版本在2.2.2以上

以上四个方法中,区分为无参方法和带参方法,带参方法中的参数为ContentView的宽高,在某些情况下执行动画时可能需要宽高参数,此时就可以Override带参方法来实现。

如果您需要修改您的动画,您也可以通过相关的setter指定您的动画。

Animation Animator 描述
setShowAnimation() setShowAnimator() 设置弹窗展示动画
setDismissAnimation() setDismissAnimator() 设置弹窗消失动画
提示
onCreateXX()回调仅会在您没设置过动画时会回调,如果设置过动画,这些方法将不会再被调用。
如果您需要再次回调上述方法,请使用相关的setter方法将动画设置为null

从2.2.4版本开始,我们提供了更好用的动画创建辅助类:AnimationHelper,建议您升级到2.2.4或更高的版本并尝试使用AnimationHelper,更多信息请查阅:进阶指引-动画-AnimationHelper

示例

  1. public class DemoPopup extends BasePopupWindow {
  2. public DemoPopup(Context context) {
  3. super(context);
  4. setContentView(R.layout.popup_normal);
  5. //不裁剪contentView
  6. setClipChildren(false);
  7. }
  8. @Override
  9. protected Animator onCreateShowAnimator() {
  10. return createAnimator(true);
  11. }
  12. @Override
  13. protected Animator onCreateDismissAnimator() {
  14. return createAnimator(false);
  15. }
  16. private Animator createAnimator(boolean isShow) {
  17. ObjectAnimator showAnimator = ObjectAnimator.ofFloat(getDisplayAnimateView(),
  18. View.TRANSLATION_Y,
  19. isShow ? getHeight() * 0.75f : 0,
  20. isShow ? 0 : getHeight() * 0.75f);
  21. showAnimator.setDuration(1000);
  22. showAnimator.setInterpolator(new OvershootInterpolator(isShow ? 6 : -6));
  23. return showAnimator;
  24. }
  25. }

wiki_animation_ex.gif