Fix fling gestures when expanding the AppBar from RecyclerView

Fling gestures don't work when expanding the AppBar. Define a new
behavior class to fix them

https://issuetracker.google.com/issues/37058076
https://stackoverflow.com/a/32454407
This commit is contained in:
Gabriele M
2017-07-18 12:23:38 +02:00
parent e710060baa
commit fecd837b70
3 changed files with 47 additions and 1 deletions

View File

@@ -1,2 +1,4 @@
-keep class android.support.design.widget.** { *; }
-keep interface android.support.design.widget.** { *; }
-keep class org.lineageos.updater.ui.FlingBehavior { *; }

View File

@@ -11,7 +11,8 @@
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
android:fitsSystemWindows="true"
app:layout_behavior="org.lineageos.updater.ui.FlingBehavior">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"

View File

@@ -0,0 +1,43 @@
package org.lineageos.updater.ui;
import android.content.Context;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
public final class FlingBehavior extends AppBarLayout.Behavior {
private static final int TOP_CHILD_FLING_THRESHOLD = 3;
private boolean isPositive;
public FlingBehavior() {
}
public FlingBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child,
View target, float velocityX, float velocityY, boolean consumed) {
if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
velocityY = velocityY * -1;
}
if (target instanceof RecyclerView && velocityY < 0) {
final RecyclerView recyclerView = (RecyclerView) target;
final View firstChild = recyclerView.getChildAt(0);
final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
}
return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY,
consumed);
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
isPositive = dy > 0;
}
}