Eu criei um CollapsingToolbarLayout simples e funciona perfeitamente. Meu problema é que, se eu tento usar um pergaminho no nestedscrollview , ele simplesmente para quando eu solto meu dedo. A rolagem normal funciona como deveria.
O código de minhas atividades não foi alterado => atividade vazia gerada automaticamente . (Acabei de clicar em criar uma nova atividade vazia no android studio e ainda editei o XML).
Eu li aqui que os gestos de rolagem no próprio imageview são bugs, mas não, que a rolagem em si tem bugs: veja aqui .
Tentei ativar a "rolagem suave" por meio do código java. Parece que, se eu rolar para longe o suficiente para que a visualização da imagem não seja mais visível, os gestos de lançamento são reconhecidos.
TLDR: Por que o gesto de arremesso não funciona, desde que a visualização da imagem esteja visível? Meu código XML é assim:
<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>
fonte
ACTION_DOWN y=98 -> ACTION_MOVE y=-40 -> ACTION_MOVE y=-33 -> ACTION_UP y=97
. Parece que o evento de último toque está relatando incorretamente a si mesmo como sendo próximo ao primeiro.nestedScrollView.getParent().requestDisallowInterceptTouchEvent(true);
a visualização de rolagem aninhadaRespostas:
Eu tive exatamente o mesmo problema com CollapsingToolbarLayout com ImageView dentro e NestedScrollView . A rolagem rápida para quando o dedo é liberado.
No entanto, percebi algo estranho. Se você começar a rolar com o dedo a partir de uma visualização com OnClickListener (por exemplo, Botão), a rolagem fling funciona perfeitamente.
Portanto, resolvi com uma solução estranha. Defina OnClickListener (que não faz nada) no filho direto de NestedScrollView . Então funciona perfeitamente!
Dê ao filho direto (LinearLayout) um id e defina OnClickListener em Activity
Notas:
Testado usando Support Design Library 25.0.1
CollapsingToolbarLayout com scrollFlags = "scroll | enterAlwaysCollapsed"
fonte
Sei que esta pergunta foi feita há mais de um ano, mas esse problema ainda não parece ter sido resolvido nas bibliotecas de Suporte / Design. Você pode marcar esse problema com uma estrela para que ele avance mais para cima na fila de prioridades.
Dito isso, tentei a maioria das soluções postadas para isso, incluindo a de patrick-iv, sem sucesso. A única maneira de começar a trabalhar foi imitar o caso e chamá-lo de maneira programática se um determinado conjunto de condições fosse detectado em
onPreNestedScroll()
. Nas poucas horas de minha depuração, percebi que o programaonNestedFling()
nunca foi chamado para cima (rolar para baixo) e parecia ser consumido prematuramente. Não posso dizer com 100% de certeza que isso funcionará para 100% das implementações, mas funciona bem o suficiente para o meu uso, então acabei me conformando com isso, embora seja muito hackeado e definitivamente não é o que eu queria fazer.E aplique-o ao AppBar
Demonstração do CheeseSquare: antes depois
fonte
enterAlways
layout_ScrollFlag para que funcionasse, mas está funcionando bem agoraTentei a solução de Floofer, mas ainda não era boa o suficiente para mim. Então eu vim com uma versão melhor de seu comportamento. O AppBarLayout agora se expande e se fecha suavemente ao ser lançado.
Nota: Eu usei reflexão para hackear meu caminho para isso, então pode não funcionar perfeitamente com uma versão da biblioteca de design do Android diferente de 25.0.0.
Para usá-lo, defina um novo comportamento para seu AppBarLayout.
fonte
Essa resposta resolveu esse problema para mim. Crie um personalizado
AppBarLayout.Behavior
como este:e adicione-o
AppBarLayout
assim:fonte
Estou apenas postando isso aqui para que outros não percam nos Comentários. A resposta de Jinang funciona perfeitamente, mas parabéns a AntPachon por apontar um método muito mais simples para fazer o mesmo. Em vez de implementar um
OnClick
método de formaChild of the NestedScrollView
programática, a melhor maneira é definirclickable=true
no xml para o filho.(Usando o mesmo exemplo de Jinang )
fonte
No código: https://android.googlesource.com/platform/frameworks/support/+/master/core-ui/java/android/support/v4/widget/NestedScrollView.java#834
Quando eu uso uma rolagem fling no NestedScrollView às vezes "mIsBeingDragged = false", então NestedScrollView não despacha evento fling.
Quando eu excluir a
if (mIsBeingDragged)
declaração.não haverá problema. Mas não sei que outros problemas graves serão causados
fonte