J'ai créé un simple CollapsingToolbarLayout et cela fonctionne comme un charme. Mon problème est que si j'essaie d'utiliser un fling scroll sur le nestedscrollview , il s'arrête juste lorsque je relâche mon doigt. Le défilement normal fonctionne comme il se doit.
Mon code d'activités est inchangé => activité vide générée automatiquement . (Je viens de cliquer sur créer une nouvelle activité vide dans le studio Android et encore modifié le XML).
J'ai lu ici, que les gestes de défilement sur l'image vue elle-même sont bogués, mais pas, que le défilement lui-même est bogué: voir ici .
J'ai essayé d'activer le "défilement fluide" à travers le code java. Il semble que si je fais défiler suffisamment loin pour que la vue de l'image ne soit plus visible, les gestes de lancement sont alors reconnus.
TLDR: Pourquoi le geste fling ne fonctionne-t-il pas tant que l'image vue est visible? Mon code XML ressemble à ceci:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/profile_app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/profile_collapsing_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp"
android:fitsSystemWindows="true">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="420dp"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
android:src="@drawable/headerbg"
android:maxHeight="192dp"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
app:layout_anchor="@id/profile_app_bar_layout"
app:layout_anchorGravity="bottom|right|end"
android:layout_height="@dimen/fab_size_normal"
android:layout_width="@dimen/fab_size_normal"
app:elevation="2dp"
app:pressedTranslationZ="12dp"
android:layout_marginRight="8dp"
android:layout_marginEnd="8dp"/>
<android.support.v4.widget.NestedScrollView
android:id="@+id/profile_content_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_gravity="fill_vertical"
android:minHeight="192dp"
android:overScrollMode="ifContentScrolls"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/LoremIpsum"/>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
la source
ACTION_DOWN y=98 -> ACTION_MOVE y=-40 -> ACTION_MOVE y=-33 -> ACTION_UP y=97
. Il semble que le dernier événement tactile se signale à tort comme étant à côté du premier.nestedScrollView.getParent().requestDisallowInterceptTouchEvent(true);
votre vue de défilement imbriquéeRéponses:
J'ai eu exactement le même problème avec CollapsingToolbarLayout avec ImageView à l' intérieur et NestedScrollView . Le défilement fling s'arrête lorsque le doigt est relâché.
Cependant, j'ai remarqué quelque chose d'étrange. Si vous commencez à faire défiler avec votre doigt d'une vue avec OnClickListener (par exemple Button), le défilement fling fonctionne parfaitement.
Ainsi je l'ai corrigé avec une solution étrange. Définissez OnClickListener (qui ne fait rien) sur l'enfant direct de NestedScrollView . Ensuite, cela fonctionne parfaitement!
Donner un identifiant à l'enfant direct (LinearLayout) et définir OnClickListener dans Activity
Remarques:
Testé à l'aide de la bibliothèque de conception de support 25.0.1
CollapsingToolbarLayout with scrollFlags = "scroll | enterAlwaysCollapsed"
la source
Je sais que cette question a été posée il y a plus d'un an, mais ce problème ne semble toujours pas être résolu dans les bibliothèques Support / Design. Vous pouvez marquer ce problème pour qu'il monte plus haut dans la file d'attente prioritaire.
Cela dit, j'ai essayé la plupart des solutions publiées pour cela, y compris celle de patrick-iv sans succès. La seule façon dont j'ai pu me rendre au travail était d'imiter le fling et de l'appeler par programme si un certain ensemble de conditions était détecté
onPreNestedScroll()
. Dans les quelques heures de mon débogage, j'ai remarqué que leonNestedFling()
n'a jamais été appelé sur un fling vers le haut (défilement vers le bas) et semblait être consommé prématurément. Je ne peux pas dire avec 100% de certitude que cela fonctionnera pour 100% des implémentations, mais cela fonctionne assez bien pour mes utilisations, alors j'ai fini par me contenter de cela, même si c'est assez piraté et certainement pas ce que je voulais faire.Et appliquez-le à l'AppBar
Démo CheeseSquare: Avant Après
la source
enterAlways
fallu supprimer layout_ScrollFlag pour que cela fonctionne, mais fonctionne bien maintenantJ'ai essayé la solution Floofer mais ce n'était toujours pas assez bon pour moi. Je suis donc venu avec une meilleure version de son comportement. L'AppBarLayout se développe maintenant et se réduit en douceur lors du lancement.
Remarque: j'ai utilisé la réflexion pour me frayer un chemin, donc cela peut ne pas fonctionner parfaitement avec une version de la bibliothèque Android Design différente de 25.0.0.
Pour l'utiliser, définissez un nouveau comportement sur votre AppBarLayout.
la source
Cette réponse a résolu ce problème pour moi. Créez une personnalisation
AppBarLayout.Behavior
comme celle-ci:et ajoutez-le
AppBarLayout
comme ceci:la source
Je publie simplement ceci ici pour que les autres ne le manquent pas dans les commentaires. La réponse de Jinang fonctionne à merveille, mais bravo à AntPachon pour avoir souligné une méthode beaucoup plus simple pour la même chose. Au lieu d'implémenter une
OnClick
méthode sur leChild of the NestedScrollView
programme, une meilleure façon est de définirclickable=true
le xml pour l'enfant.(En utilisant le même exemple que celui de Jinang )
la source
Dans le code :https://android.googlesource.com/platform/frameworks/support/+/master/core-ui/java/android/support/v4/widget/NestedScrollView.java#834
Quand j'utilise un fling scroll sur le NestedScrollView parfois "mIsBeingDragged = false", donc NestedScrollView ne dispense pas d'événement fling.
Lorsque je supprime la
if (mIsBeingDragged)
déclaration.il n'y aura aucun problème. Mais je ne sais pas quels autres problèmes graves seront causés
la source