1
votes

FloatingActionButton lors du défilement vers le bas effet caché

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 .


0 commentaires

3 Réponses :


2
votes

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


2 commentaires

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?



2
votes

Grâce à @JEFF, après avoir surveillé le OnScrollChangeListener , j'ai changé la valeur de condition en
scrollY et elle réapparaît.
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

La première est d'utiliser fab.hide et fab.show

au lieu de la méthode 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


0 commentaires

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

0 commentaires