use*_*628 12 java xml android overscroll android-appbarlayout
使用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>
Run Code Online (Sandbox Code Playgroud)
其次是简单的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();
}
}
Run Code Online (Sandbox Code Playgroud)
MyFragmentList是一个带有RecycleView的片段,其内容可以滚动应用程序.
但是,如果我从xml中删除AppBarLayout并保持工具栏打开(只是注释AppBarLayout打开和关闭),它将在滚动时显示过卷动画(发光).
或者,如果您删除,layout_scrollFlags="scroll"则过度滚动有效,但滚动时无法隐藏操作栏.
有关额外信息,请调试RecycleView,第2272行
if(this.mBottomGlow != null && !this.mBottomGlow.isFinished()) {
Run Code Online (Sandbox Code Playgroud)
包含AppBarLayout时总是完成,而当它不存在时没有完成.有什么东西会覆盖其触摸事件吗?
有谁知道谁用AppBarLayout显示过度滚动动画(发光)?
编辑:这个错误似乎有一张票。你绝对可以做 artur.dr...@gmail.com 所做的事情并扩展 RecyclerView 来覆盖 RecyclerView#dispatchNestedScroll 以始终返回 false (他在报告中写为 true )你可以让过度滚动动画正常工作,尽管我很确定它可能会破坏某些东西。
不幸的是,RecyclerView 的编码方式以及 NestedScrollingChild API 的制作方式没有干净的方法来实现所需的行为。
这是来自 RecyclerView(23.1.1,但是我不相信解决问题之前的任何版本)的方法内的scrollByInternal。
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);
}
Run Code Online (Sandbox Code Playgroud)
正如我们在dispatchNestedScroll(NestedScrollingChild API 的一部分)的 javadoc 上看到的,只要有一个父级消耗滚动,RecyclerView 就不会应用任何过度滚动动画(边缘发光)。
AppBarLayout 确实会消耗滚动,更具体地说,只要有一个 NestedScrollingParent 在 onStartNestedScroll 上返回 true,就不会发生过度滚动动画。
CoordinatorLayout 是一个 NestedScrollingParent,但不会返回 true,除非有一个 CoordinatorLayout.Behavior 会返回 true。AppBarLayout 的默认行为确实实现了此方法,当存在垂直滚动 + AppBarLayout 有要滚动的内容 + 视图足够大可以滚动时返回 true。
// 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();
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
老实说,我无法判断这是否是一个错误,因为这两种逻辑都有道理。如果您滚动到视图的顶部,并且有类似于 CollapsingToolbar 的东西,您不会希望发生过度滚动动画。然而,有一种方法可以使该行为可以消耗 x/y 滚动量来停止动画的发生。同样奇怪的是,滚动和滑动的代码是不同的。