簡體   English   中英

向下滾動隱藏效果的 FloatingActionButton

[英]FloatingActionButton on scroll down hidden effect

我試圖讓floatingActionButton在向下滾動時隱藏並在向上滾動時再次顯示,我使用setOnScrollChangeListener for 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);
            }
        }
    });
}

結果
它似乎有效,但有時會出現兩個問題,當向上滾動 fab 時不會出現,其次它會直接消失而沒有任何影響,在這個 GIF目的地中越清晰。

問題是因為從頂部滾動到底部后,它確實會被隱藏,但它不知道何時滾動到頂部,因為位置中的mScrollY < 0並不真正小於 0。嘗試使用此代碼,它可以給出舊位置和新位置的位置,然后你可以比較它,這樣它就會知道你什么時候開始滾動到頂部或底部

這是鏈接: https : //stackoverflow.com/a/33230992/10396176

感謝@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();
        }
    });
}

第二種方法是使用自定義縮放動畫向上、向下調用,就像這個答案

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

我通過在我的 FAB xml 中使用以下內容實現了相同的目的。 沒有其他要求:

app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM