Сглаживание AppBarLayout с NestedScrollView с использованием AppBarLayout.Behavior
У меня есть AppBarLayout и NestedScrollView. Я хочу, чтобы NestedScrollView всегда прокручивался вниз, AppBarLayout также должен плавно расширяться, без остановки NestedScrollView перед тем, как AppBarLayout Expand; второй Полет / Свиток требуется, чтобы сделать это.
Я проверил stackru и нашел, что это решение довольно связано и может быть использовано. Но вместо этого, если NestedScrollView, это RecyclerView. Это в /questions/7484492/otbrasyivanie-s-recyclerview-appbarlayout/7484502#7484502
Я в основном взял код и немного его изменил, и использовал для проверки скорости>8000, чтобы рассмотреть также Fling AppBarLayout как код ниже.
public final class FlingBehavior extends AppBarLayout.Behavior {
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 NestedScrollView && Math.abs(velocityY) > 8000) {
consumed = false;
}
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;
}
}
Это работает, но не идеально. Я только хочу начать (продолжить) Fling на AppBarLayout (т.е. вернуть consumed = false
), когда NestedScrollView достигнет вершины прокрутки. Как я могу проверить это в onNestedFling?
Благодарю.
2 ответа
Вы должны проверить NestedScrollView и NestedScrollingChild
if (target instanceof NestedScrollView && Math.abs(velocityY) > 8000) {
consumed = false;
}
if (target instanceof NestedScrollingChild && Math.abs(velocityY) > 8000) {
consumed = false;
}
Проблема была решена с библиотеками в этом хранилище.
( https://developer.android.com/topic/libraries/support-library/setup.html)
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}