返回介绍

3.fab 的动画

发布于 2024-12-23 22:29:23 字数 3510 浏览 0 评论 0 收藏 0

fab 还支持 fab 以动画的方式显现/隐藏,通常和 AppBarLayout 一起使用,可以通过 hide() / show() 两个方法控制。

那么动画是如何实现的呢:

private void show(OnVisibilityChangedListener listener, boolean fromUser) {
    getImpl().show(wrapOnVisibilityChangedListener(listener), fromUser);
  }
  
private void hide(@Nullable OnVisibilityChangedListener listener, boolean fromUser) {
  getImpl().hide(wrapOnVisibilityChangedListener(listener), fromUser);
}

这里因为要兼容不同版本,所以具体实现也交给了不同的 fab 实现类。3.x 之后很好办,直接使用属性动画,如果是 3.x 之前的话,那么只能使用传统的 Animation 了

hide() 为例,使用属性动画较为简单,直接使用 View#animate() 即可链式调用。

@Override
  void hide(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
    if (mIsHiding || mView.getVisibility() != View.VISIBLE) {
      // A hide animation is in progress, or we're already hidden. Skip the call
      if (listener != null) {
        listener.onHidden();
      }
      return;
    }

    if (!ViewCompat.isLaidOut(mView) || mView.isInEditMode()) {
      // If the view isn't laid out, or we're in the editor, don't run the animation
      mView.internalSetVisibility(View.GONE, fromUser);
      if (listener != null) {
        listener.onHidden();
      }
    } else {
      mView.animate().cancel();
      mView.animate()
          .scaleX(0f)
          .scaleY(0f)
          .alpha(0f)
          .setDuration(SHOW_HIDE_ANIM_DURATION)
          .setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR)
          .setListener(new AnimatorListenerAdapter() {
            private boolean mCancelled;

            @Override
            public void onAnimationStart(Animator animation) {
              mIsHiding = true;
              mCancelled = false;
              mView.internalSetVisibility(View.VISIBLE, fromUser);
            }

            @Override
            public void onAnimationCancel(Animator animation) {
              mIsHiding = false;
              mCancelled = true;
            }

            @Override
            public void onAnimationEnd(Animator animation) {
              mIsHiding = false;
              if (!mCancelled) {
                mView.internalSetVisibility(View.GONE, fromUser);
                if (listener != null) {
                  listener.onHidden();
                }
              }
            }
          });
    }
  }

如果使用传统动画的话,则先在 xml 中定义好动画,然后构造 Animation 实例,启动动画。

 @Override
  void hide(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
    if (mIsHiding || mView.getVisibility() != View.VISIBLE) {
      // A hide animation is in progress, or we're already hidden. Skip the call
      if (listener != null) {
        listener.onHidden();
      }
      return;
    }

    Animation anim = android.view.animation.AnimationUtils.loadAnimation(
        mView.getContext(), R.anim.design_fab_out);
    anim.setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR);
    anim.setDuration(SHOW_HIDE_ANIM_DURATION);
    anim.setAnimationListener(new AnimationUtils.AnimationListenerAdapter() {
      @Override
      public void onAnimationStart(Animation animation) {
        mIsHiding = true;
      }

      @Override
      public void onAnimationEnd(Animation animation) {
        mIsHiding = false;
        mView.internalSetVisibility(View.GONE, fromUser);
        if (listener != null) {
          listener.onHidden();
        }
      }
    });
    mView.startAnimation(anim);
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文