gpt4 book ai didi

java - Lollipop AppBarLayout/Toolbar 缺少滚动动画

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:19 34 4
gpt4 key购买 nike

使用 AppBarLayout 和 Toolbar 的最基本示例,在尝试滚动更多时我看不到过度滚动动画(从底部或顶部发光)。但是,如果您扔掉内容,它会显示出来。

这是代码 (nav_drawer_toolbar_layout.xml):

<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">

<!-- Replace fragments in this content frame, like a RecycleView -->
<FrameLayout
android:id="@+id/content_frame"
app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
app:titleTextAppearance="@style/Base.TextAppearance.AppCompat.Title"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

后面是简单的 Activity 类:

public class MyActivity extends AppCompatActivity implements {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nav_drawer_toolbar_layout);

// Setup the toolbar/actionbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FragmentManager manager = getFragmentManager();
manager.beginTransaction().replace(R.id.content_frame, new MyFragmentList).commit();
}
}

MyFragmentList 是一个带有 RecycleView 的 fragment ,其中包含用于滚动应用程序的内容。

但是,如果我从 xml 中删除 AppBarLayout 并让工具栏保持打开状态(只需评论 AppBarLayout 打开和关闭),它将在滚动时显示过度滚动动画(发光)。

或者,如果您删除 layout_scrollFlags="scroll",则过度滚动会起作用,但您无法在滚动时隐藏操作栏。

有关额外信息,调试 RecycleView,第 2272 行

if(this.mBottomGlow != null && !this.mBottomGlow.isFinished()) {

在包含 AppBarLayout 时始终完成,而在不存在时则未完成。是否有东西覆盖了它的触摸事件?

有谁知道谁可以使用 AppBarLayout 显示滚动动画(发光)?

最佳答案

编辑:似乎有一个 ticket对于这个错误。您可以明确地做 artur.dr...@gmail.com 所做的并扩展 RecyclerView 以覆盖 RecyclerView#dispatchNestedScroll 以始终返回 false(他在他的报告中写为 true)您可以获得滚动动画工作,但我很确定它可能会破坏某些东西。

不幸的是,RecyclerView 的编码方式和 NestedScrollingChild API 的制作方式没有干净的方法来实现所需的行为。

这是来自方法 scrollByInternal 中的 RecyclerView(23.1.1,但我不相信它修复问题之前的任何版本)。

if (dispatchNestedScroll(consumedX, consumedY, unconsumedX, unconsumedY, mScrollOffset)) {
// Update the last touch co-ords, taking any scroll offset into account
mLastTouchX -= mScrollOffset[0];
mLastTouchY -= mScrollOffset[1];
if (ev != null) {
ev.offsetLocation(mScrollOffset[0], mScrollOffset[1]);
}
mNestedOffsets[0] += mScrollOffset[0];
mNestedOffsets[1] += mScrollOffset[1];
} else if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) {
if (ev != null) {
pullGlows(ev.getX(), unconsumedX, ev.getY(), unconsumedY);
}
considerReleasingGlowsOnScroll(x, y);
}

正如我们在 dispatchNestedScroll(NestedScrollingChild API 的一部分)的 javadoc 中看到的,只要有一个父级使用滚动,RecyclerView 就不会应用任何过度滚动动画(边缘发光)。

AppBarLayout 确实会消耗滚动,更具体地说,只要有一个在 onStartNestedScroll 上返回 true 的 NestedScrollingParent,就不会发生过度滚动动画。

CoordinatorLayout 是一个 NestedScrollingParent,但不会返回 true,除非有 CoordinatorLayout.Behavior 返回。 AppBarLayout 的默认行为确实实现了这个方法,当有垂直滚动时返回 true + AppBarLayout 有东西可以滚动 + view 足够大可以滚动。

// Return true if we're nested scrolling vertically, and we have scrollable children
// and the scrolling view is big enough to scroll
final boolean started = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0
&& child.hasScrollableChildren()
&& parent.getHeight() - directTargetChild.getHeight() <= child.getHeight();

Flinging 采用了一种略微不同的方法,无论 NestedScrollingParent 是否消耗滚动都允许过度滚动动画发生。

if (!dispatchNestedPreFling(velocityX, velocityY)) {
final boolean canScroll = canScrollHorizontal || canScrollVertical;
dispatchNestedFling(velocityX, velocityY, canScroll);

if (canScroll) {
velocityX = Math.max(-mMaxFlingVelocity, Math.min(velocityX, mMaxFlingVelocity));
velocityY = Math.max(-mMaxFlingVelocity, Math.min(velocityY, mMaxFlingVelocity));
mViewFlinger.fling(velocityX, velocityY);
return true;
}
}

老实说,我不知道这是否是一个错误,因为两种逻辑都有意义。如果您正在滚动到 View 的顶部,并且您有类似于 CollapsingToolbar 的东西,您不希望发生过度滚动动画。然而,有一种方法可以让行为消耗 x/y 滚动量来阻止动画发生。滚动和滑动的代码不同也很奇怪。

关于java - Lollipop AppBarLayout/Toolbar 缺少滚动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32667237/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com