简单的问题,但我找不到答案。我如何折叠或展开 CollapsingToolbarLayout的编程?
CollapsingToolbarLayout
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
我使用这个代码来折叠工具栏。仍然找不到一种方法来展开它。
public void collapseToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true); } }
编辑1: 相同的函数与负速度 但是工具栏没有100% 扩展和假为最后一个参数应该工作
public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false); } }
编辑2: 这段代码帮了我大忙
public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.setTopAndBottomOffset(0); behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]); } }
将尝试自己实现行为。
我已经写了一个小扩展到 AppBarLayout。它允许 CollapsibleToolbarLayout的扩张和崩溃,无论有没有动画。它似乎做得很好。
AppBarLayout
CollapsibleToolbarLayout
请随意试用
只要使用它而不是 AppBarLayout,就可以调用负责 CollapsingToolbarLayout展开或折叠的方法。
它在我的项目中正常工作,但是您可能需要调整 perform...方法(特别是在 performExpandingWithAnimation()中)中的换行/滚动值,以完全适合您的 CollapsibleToolbarLayout。
perform...
performExpandingWithAnimation()
使用支持库 v23,可以调用 appBarLayout.setExpanded(true/false)。
appBarLayout.setExpanded(true/false)
延伸阅读: SetExpated (boolean)
可以使用自定义动画器定义它的展开或折叠程度。 用 setTopAndBottomOffset(int)。
setTopAndBottomOffset(int)
这里有一个例子:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams(); final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if (behavior != null) { ValueAnimator valueAnimator = ValueAnimator.ofInt(); valueAnimator.setInterpolator(new DecelerateInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue()); appBar.requestLayout(); } }); valueAnimator.setIntValues(0, -900); valueAnimator.setDuration(400); valueAnimator.start(); }
对于那些想要使用 onNestedPreScroll 并像我一样得到错误的人来说。 我在 onCreate 中得到了 NullPointerException,但是没有这一行
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); //below line params.setBehavior(new AppBarLayout.Behavior() {});
而且不能正常工作。 但我解决这个问题
在 onCreate 中:
scrollToolbarOnDelay();
还有..。
public void scrollToolbarOnDelay() { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar); CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0}); else scrollToolbarOnDelay() } }, 100); }
使用 mAppBarLayout.setExpanded(true)展开“工具栏”,并使用 mAppBarLayout.setExpanded(false)折叠“工具栏”。
mAppBarLayout.setExpanded(true)
mAppBarLayout.setExpanded(false)
如果你想改变 折叠工具栏布局高度编程,然后只是使用 mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setLayoutParams(params)
展开:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*200; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(true);
崩溃:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*80; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(false);
这可能有助于扩张或崩溃:
appBarLayout.setActivated(true); appBarLayout.setExpanded(true, true);
试试这个..。
扩张
appBarLayout.setExpanded(true, true);
回忆
appBarLayout.setExpanded(false, true);
我用过这个
private fun collapseAppbar() { scrollView.postDelayed(Runnable { scrollView?.smoothScrollTo(50, 50) }, 400) }
以编程方式展开/折叠 AppBarLayout:
fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){ appBarLayout.setExpanded(expand, isAnimationEnabled); }