以编程方式折叠或展开CollapsingToolbarLayout

Tom*_*mas 151 android android-collapsingtoolbarlayout

简单的问题,但我找不到答案.如何以CollapsingToolbarLayout编程方式折叠或展开?

折叠的工具栏

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

扩展工具栏

jax*_*xvy 304

使用支持库v23,您可以致电appBarLayout.setExpanded(true/false).

进一步阅读:AppBarLayout.setExpanded(boolean)

  • 是否可以使用支持库23.1.1定义自定义动画?setExpanded(boolean,true)有一个非常慢的动画...... (6认同)
  • 好的,谢谢你的提示,但支持libs v23是非常错误的,所以我现在不能测试它,因为我需要留在22.2.1 .... (2认同)

Tuấ*_*Anh 48

我使用此代码折叠工具栏.还是找不到扩展它的方法.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑1:具有负速度Y的相同功能,但工具栏未扩展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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑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]);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • setTopAndBottomOffset会扩展工具栏
  • onNestedPreScroll确实显示扩展工具栏中的内容

将尝试自己实现行为.

  • 如果将`onNestedFling`的最后一个参数设置为`false`,则编辑1也将起作用. (2认同)
  • params.getBehavior()返回null.在xml中,layout_behaviour标记设置在兄弟NestedScrollView上,而不是AppBarLayout上.你能帮助我吗? (2认同)

小智 24

您可以使用自定义动画制作工具定义它展开或折叠的程度.只需使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这是实际让您为自定义偏移设置动画的唯一答案。非常感谢! (3认同)
  • appBar.setExpanded(false,true); (打开/关闭,动画)您不需要编写所有这些行 (2认同)
  • 对@Puni,如果您想扩展/折叠到“自定义”偏移量(例如进行多个阶段折叠),您将需要这个。 (2认同)

Bar*_*ski 12

我写了一个小扩展名AppBarLayout.它允许CollapsibleToolbarLayout在有和没有动画的情况下扩展和折叠两者.它似乎做得很对.

随意尝试一下.

只需使用它而不是你的AppBarLayout,你可以调用负责扩展或折叠的方法CollapsingToolbarLayout.

它在我的项目中完全按照预期工作,但您可能需要调整方法中的fling/scroll值perform...(特别是在performExpandingWithAnimation())以完全适合您的CollapsibleToolbarLayout.


Fer*_*med 8

使用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);
Run Code Online (Sandbox Code Playgroud)

坍塌:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
Run Code Online (Sandbox Code Playgroud)


Sep*_*ehr 5

对于想要使用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() {});
Run Code Online (Sandbox Code Playgroud)

并且无法正常使用此功能.但我解决这个问题

in onCreate:

        scrollToolbarOnDelay();
Run Code Online (Sandbox Code Playgroud)

和...

    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);


        }
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试这个...

扩张

appBarLayout.setExpanded(true, true);
Run Code Online (Sandbox Code Playgroud)

回忆一下

appBarLayout.setExpanded(false, true);
Run Code Online (Sandbox Code Playgroud)