以编程方式折叠或展开 CollapsingToolbarLayout
Programmatically collapse or expand 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:具有负速度 Y 的相同功能但工具栏未扩展 100%,最后一个参数为 false 应该可以工作
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]);
}
}
- setTopAndBottomOffset 展开工具栏
- onNestedPreScroll 显示扩展工具栏中的内容
会尝试自己实现Behavior。
我已经为 AppBarLayout
写了一个小扩展。它允许在有和没有动画的情况下展开和折叠 CollapsibleToolbarLayout
。它似乎做得很对。
只需使用它代替您的 AppBarLayout
,您就可以调用负责展开或折叠 CollapsingToolbarLayout
的方法。
它在我的项目中完全按照预期工作,但您可能需要调整 perform...
方法中的 fling/scroll 值(尤其是 performExpandingWithAnimation()
中的值)以完全适合您的 CollapsibleToolbarLayout
.
使用支持库 v23,您可以调用 appBarLayout.setExpanded(true/false)
。
您可以使用自定义动画器定义展开或折叠的程度。
只需使用 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)
折叠工具栏。
如果您想以编程方式更改 CollapsingToolbarLayout 高度,则只需使用 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)
}
以编程方式expand/collapse AppBarLayout:
fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
appBarLayout.setExpanded(expand, isAnimationEnabled);
}
简单的问题,但我找不到答案。如何以编程方式折叠或展开 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:具有负速度 Y 的相同功能但工具栏未扩展 100%,最后一个参数为 false 应该可以工作
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]);
}
}
- setTopAndBottomOffset 展开工具栏
- onNestedPreScroll 显示扩展工具栏中的内容
会尝试自己实现Behavior。
我已经为 AppBarLayout
写了一个小扩展。它允许在有和没有动画的情况下展开和折叠 CollapsibleToolbarLayout
。它似乎做得很对。
只需使用它代替您的 AppBarLayout
,您就可以调用负责展开或折叠 CollapsingToolbarLayout
的方法。
它在我的项目中完全按照预期工作,但您可能需要调整 perform...
方法中的 fling/scroll 值(尤其是 performExpandingWithAnimation()
中的值)以完全适合您的 CollapsibleToolbarLayout
.
使用支持库 v23,您可以调用 appBarLayout.setExpanded(true/false)
。
您可以使用自定义动画器定义展开或折叠的程度。
只需使用 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)
折叠工具栏。
如果您想以编程方式更改 CollapsingToolbarLayout 高度,则只需使用 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)
}
以编程方式expand/collapse AppBarLayout:
fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
appBarLayout.setExpanded(expand, isAnimationEnabled);
}