欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定义FloatingActionButton滑动行为只隐藏不出现的问题小结

程序员文章站 2024-02-21 22:47:04
先来段behavior代码,网上关于floatingactionbutton(以下简称fab)滑动的代码很多了,参考一下。 public class fabbeh...

先来段behavior代码,网上关于floatingactionbutton(以下简称fab)滑动的代码很多了,参考一下。

public class fabbehavior extends floatingactionbutton.behavior{
  private static final interpolator interpolator = new fastoutslowininterpolator();
  private boolean misanimatingout = false;
  public fabbehavior(context context, attributeset attrs) {
    super();
  }
  @override
  public boolean onstartnestedscroll(final coordinatorlayout coordinatorlayout, final floatingactionbutton child,
                    final view directtargetchild, final view target, final int nestedscrollaxes) {
    // ensure we react to vertical scrolling
    return nestedscrollaxes == viewcompat.scroll_axis_vertical
        || super.onstartnestedscroll(coordinatorlayout, child, directtargetchild, target, nestedscrollaxes);
  }
  @override
  public void onnestedscroll(final coordinatorlayout coordinatorlayout, final floatingactionbutton child,
                final view target, final int dxconsumed, final int dyconsumed,
                final int dxunconsumed, final int dyunconsumed) {
    super.onnestedscroll(coordinatorlayout, child, target, dxconsumed, dyconsumed, dxunconsumed, dyunconsumed);
    if (dyconsumed > 0 && !this.misanimatingout && child.getvisibility() == view.visible) {
      // user scrolled down and the fab is currently visible -> hide the fab
      animateout(child);
    } else if (dyconsumed < 0 && child.getvisibility() != view.visible) {
      // user scrolled up and the fab is currently not visible -> show the fab
      animatein(child);
    }
  }
  // same animation that floatingactionbutton.behavior uses to hide the fab when the appbarlayout exits
  private void animateout(final floatingactionbutton button) {
    if (build.version.sdk_int >= 14) {
      viewcompat.animate(button).translationy(button.getheight() + getmarginbottom(button)).setinterpolator(interpolator).withlayer()
          .setlistener(new viewpropertyanimatorlistener() {
            public void onanimationstart(view view) {
              fabbehavior.this.misanimatingout = true;
            }
            public void onanimationcancel(view view) {
              fabbehavior.this.misanimatingout = false;
            }
            public void onanimationend(view view) {
              fabbehavior.this.misanimatingout = false;
              view.setvisibility(view.gone);
            }
          }).start();
    } else {
    }
  }
  // same animation that floatingactionbutton.behavior uses to show the fab when the appbarlayout enters
  private void animatein(floatingactionbutton button) {
    button.setvisibility(view.visible);
    if (build.version.sdk_int >= 14) {
      viewcompat.animate(button).translationy(0)
          .setinterpolator(interpolator).withlayer().setlistener(null)
          .start();
    } else {
    }
  }
  private int getmarginbottom(view v) {
    int marginbottom = 0;
    final viewgroup.layoutparams layoutparams = v.getlayoutparams();
    if (layoutparams instanceof viewgroup.marginlayoutparams) {
      marginbottom = ((viewgroup.marginlayoutparams) layoutparams).bottommargin;
    }
    return marginbottom;
  }
}

这是自定义的一个behavior类,主要在onnestedscroll中自定义了出现和消失的动画。使用的时候,在xml文件中给fab加一个包含完整behavior类名的layout_behavior属性

app:layout_behavior="com.normalframe.widgets.view.fabbehavior"

这样fab就会随着列表上滑消失,下滑出现。这个功能主要是要处理fab的位置会使列表最后一项被挡住的问题,当上滑时,fab隐藏,这样当到达列表底部最后一项时,由于刚刚的动作是上滑动作,所以fab处于隐藏状态,不会遮挡到列表。

在写这个功能时,发现了一个问题:

上滑时fab能够正常隐藏,但是下拉列表时,fab就不出现了。

而一样的代码如果放到其它项目中,有些又可以正常实现功能。debug的时候发现,上拉时会调用onnestedscroll,于是其中自定义的隐藏方法可以被调用,但下滑时,不调用onnestedscroll。

以上所述是小编给大家介绍的android自定义floatingactionbutton滑动行为只隐藏不出现的问题小结,希望对大家有所帮助