J'essaie de masquer floatingActionButton lors du défilement vers le bas et de l'afficher à nouveau lors du défilement vers le haut, j'ai utilisé setOnScrollChangeListener pour ScrollView pour faire cela
le XML
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);
}
}
});
}
<?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"
/>
le résultat .
Cela semble fonctionner mais il y a parfois deux problèmes lorsque le défilement du fab up n'apparaît pas, deuxièmement, il disparaît directement sans aucun effet le plus clair dans ce GIF Destination .
3 Réponses :
Le problème est qu'après avoir fait défiler vers le bas à partir du haut, il est vrai qu'il sera masqué mais il ne peut pas savoir quand vous faites défiler vers le haut car votre mScrollY <0 dans la position n'est pas vraiment inférieur à 0 . essayez d'utiliser le code de celui-ci, il peut donner la position de l'ancienne et de la nouvelle position, puis vous pouvez la comparer pour qu'elle sache quand vous commencez à faire défiler vers le haut ou le bas
Voici le lien: https://stackoverflow.com/a/33230992/10396176
Merci pour les éclaircissements, une partie du problème a été résolue. reste effet caché de la fab.
Si vous en avez connaissance, merci de me le faire savoir
quels problèmes subsistent?
Grâce à @JEFF, après avoir surveillé le La première est d'utiliser OnScrollChangeListener , j'ai changé la valeur de condition en
scrollY et elle réapparaît. au lieu de la méthode
concernant le deuxième problème, je cherche Comment faire de l'animation et j'ai trouvé qu'il y avait deux façons de le faire
fab.hide et fab.show setVisibility();
le code après édition
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();
}
});
}
second way utilise des animations d'échelle personnalisées pour scall haut, bas, comme cette réponse
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();
}
}
});
}