FloatingActionButton向下滚动隐藏效果

时间:2019-02-11 14:36:01

标签: android android-layout android-widget android-scrollview floating-action-button

我试图使floatingActionButton向下滚动时隐藏,并在向上滚动时再次显示,我使用setOnScrollChangeListener进行ScrollView操作

XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".DetailsActivity"
    android:orientation="vertical">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_anchor="@id/linearLayout"
        app:layout_anchorGravity="start|bottom"
        android:layout_margin="16dp"
        android:src="@drawable/icons8_share_480"
        />

代码

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
                @Override
                public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                    if (scrollY > 0 && fab.isShown()) {
                        fab.setVisibility(View.GONE);
                    } else if (scrollY < 0) {
                        fab.setVisibility(View.VISIBLE);

                    }
                }
            });
        } else {
            scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
                @Override
                public void onScrollChanged() {
                    int mScrollY = scrollView.getScrollY();
                    if (mScrollY > 0 && fab.isShown()) {
                        fab.setVisibility(View.GONE);
                    } else if (mScrollY < 0) {
                        fab.setVisibility(View.VISIBLE);
                    }
                }
            });
        }

the result
似乎可行,但是有时在向上滚动fab时不出现两个问题,其次,在GIF Destination中更加清楚地表明,它没有任何影响就直接消失了。

3 个答案:

答案 0 :(得分:2)

问题是因为从顶部滚动到底部后确实会被隐藏,但是它不知道何时滚动到顶部,因为您所在位置的mScrollY < 0确实不小于0。请尝试使用代码由此,它可以给出旧位置和新位置的位置,然后您可以对其进行比较,这样当您开始滚动到顶部或底部时就会知道

这是链接:https://stackoverflow.com/a/33230992/10396176

答案 1 :(得分:0)

感谢@JEFF,在监视OnScrollChangeListener之后,我将条件值更改为
scrollY < 22并且它再次出现。
关于我搜索“如何制作动画”的第二个问题,我发现有两种方法可以做到这一点

第一是使用fab.hidefab.show而不是方法setVisibility();

修改后的代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            scrollView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
             //   Log.d("ScrollView","scrollX_"+scrollX+"_scrollY_"+scrollY+"_oldScrollX_"+oldScrollX+"_oldScrollY_"+oldScrollY);
                if (scrollY > 0 && fab.isShown()) {
                    fab.hide();
                } else if (scrollY < 22) {
                    fab.show();

                }
            });
        } else {
            scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
                int mScrollY = scrollView.getScrollY();
                if (mScrollY > 0 && fab.isShown()) {
                    fab.hide();
                } else if (mScrollY < 22) {
                    fab.show();
                }
            });
        }

第二种方式是使用自定义比例动画来调高或调低,例如answer

答案 2 :(得分:0)

fbListFood = findViewById(R.id.fbListFood);
        scrollView = findViewById(R.id.scrollView);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
                @Override
                public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                    if (scrollY > 0 && fbListFood.isShown()) {
                        fbListFood.hide();
                    } else if (scrollY < 22) {
                        fbListFood.show();

                    }
                }
            });
        } else {


            scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
                @Override
                public void onScrollChanged() {
                    int mScrollY = scrollView.getScrollY();
                    if (mScrollY > 0 && fbListFood.isShown()) {
                        fbListFood.hide();
                    } else if (mScrollY < 22) {
                        fbListFood.show();
                    }
                }
            });
        }
相关问题