He creado un CollapsingToolbarLayout simple y funciona como un encanto. Mi problema es que si trato de usar un desplazamiento rápido en la vista de desplazamiento anidada , simplemente se detiene cuando suelto el dedo. El desplazamiento normal funciona como debería.
Mi código de actividades no ha cambiado => actividad vacía generada automáticamente . (Acabo de hacer clic en crear una nueva actividad vacía en Android Studio y aún edité el XML).
Leí aquí, que los gestos de desplazamiento en la vista de la imagen en sí tienen errores, pero no, que el desplazamiento en sí tiene errores: vea aquí .
Intenté activar el "desplazamiento suave" a través del código java. Parece que si me desplazo lo suficiente como para que la vista de la imagen ya no sea visible, los gestos de lanzamiento se reconocen.
TLDR: ¿Por qué el gesto de arrojar no funciona mientras la vista de la imagen sea visible? Mi código XML se ve así:
<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>
fuente
ACTION_DOWN y=98 -> ACTION_MOVE y=-40 -> ACTION_MOVE y=-33 -> ACTION_UP y=97
. Parece que el último evento de toque se está reportando erróneamente como próximo al primero.nestedScrollView.getParent().requestDisallowInterceptTouchEvent(true);
su vista de desplazamiento anidadaRespuestas:
Tuve exactamente el mismo problema con CollapsingToolbarLayout con ImageView dentro y NestedScrollView . El desplazamiento se detiene cuando se suelta el dedo.
Sin embargo, he notado algo extraño. Si comienza a desplazarse con el dedo desde una vista con OnClickListener (por ejemplo, Button), el desplazamiento rápido funciona perfectamente.
Así que lo arreglé con una solución extraña. Configure OnClickListener (que no hace nada) en el elemento secundario directo de NestedScrollView . ¡Entonces funciona perfectamente!
Dele al niño directo (LinearLayout) una identificación y configure OnClickListener en Actividad
Notas:
Probado usando Support Design Library 25.0.1
CollapsingToolbarLayout con scrollFlags = "scroll | enterAlwaysCollapsed"
fuente
Sé que esta pregunta se hizo hace más de un año, pero este problema aún no parece estar resuelto en las bibliotecas de Soporte / Diseño. Usted puede destacar este problema para que suba más en la cola de prioridad.
Dicho esto, probé la mayoría de las soluciones publicadas para esto, incluida la de patrick-iv sin éxito. La única forma en que pude ponerme a trabajar fue imitar la aventura y llamarla programáticamente si se detectaba un cierto conjunto de condiciones
onPreNestedScroll()
. En las pocas horas de mi depuración noté que elonNestedFling()
nunca se llamaba en una aventura hacia arriba (desplazarse hacia abajo) y parecía consumirse prematuramente. No puedo decir con 100% de certeza que esto funcionará para el 100% de las implementaciones, pero funciona lo suficientemente bien para mis usos, así que terminé conformándome con esto, aunque es bastante hacky y definitivamente no es lo que quería hacer.Y aplícalo a la AppBar
Demostración de CheeseSquare: Antes Después
fuente
enterAlways
layout_ScrollFlag para que funcionara, pero funciona bien ahoraProbé la solución de Floofer pero todavía no fue lo suficientemente buena para mí. Así que se me ocurrió una mejor versión de su comportamiento. AppBarLayout ahora se expande y colapsa sin problemas al lanzar.
Nota: utilicé la reflexión para abrirme paso en esto, por lo que es posible que no funcione perfectamente con una versión de la biblioteca de diseño de Android diferente a la 25.0.0.
Para usarlo, establezca un nuevo comportamiento en su AppBarLayout.
fuente
Esta respuesta me resolvió este problema. Crea una personalizada
AppBarLayout.Behavior
como esta:y agréguelo así
AppBarLayout
:fuente
Solo estoy publicando esto aquí para que otros no se lo pierdan en los comentarios. La respuesta de Jinang funciona maravillosamente, pero felicitaciones a AntPachon por señalar un método mucho más simple para lo mismo. En lugar de implementar un
OnClick
métodoChild of the NestedScrollView
programáticamente, una mejor manera es configurarclickable=true
el xml para el niño.(Usando el mismo ejemplo que el de Jinang )
fuente
En el código: https://android.googlesource.com/platform/frameworks/support/+/master/core-ui/java/android/support/v4/widget/NestedScrollView.java#834
Cuando utilizo un desplazamiento de fling en NestedScrollView a veces "mIsBeingDragged = false", NestedScrollView no envía el evento de fling.
Cuando elimino la
if (mIsBeingDragged)
declaración.no habrá problema. Pero no sé qué otros problemas graves se ocasionarán
fuente