[英]How to hide FloatingActionButton which is anchored to BottomAppBar when the is hidden on scroll
[英]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。嘗試使用此代碼,它可以給出舊位置和新位置的位置,然后你可以比較它,這樣它就會知道你什么時候開始滾動到頂部或底部
感謝@JEFF,在監視OnScrollChangeListener
,我將條件中的值更改為
scrollY < 22
它又出現了。
關於我搜索如何做動畫的第二個問題,我發現有兩種方法可以做到這一點
首先是使用fab.hide
和fab.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.