CollapsingToolbarLayout以编程方式扩展动画持续时间

时间:2015-12-30 10:10:54

标签: android animation android-collapsingtoolbarlayout appbar

我在Android应用程序中使用了CollapsingToolbarLayout。我的应用程序的最低要求API是9。

当用户点击折叠的工具栏时,我需要展开折叠的工具栏,就像在最新的Gmail日历应用中一样。所以我设置了一个onClickListener,在其中我执行以下操作:

public void onClick(View v) {
     if(toolbarExpanded) {
         mAppBar.setExpanded(false, true);
     } else {
         mAppBar.setExpanded(true, true);
     }
     toolbarExpanded = !toolbarExpanded;
 }

哪个效果很好,但我的问题是它运行的动画很慢,这意味着用户体验不佳。

是否有更改持续时间或为此定义自定义动画?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

注意:这个答案基于android设计库v25.0.0。

您可以使用反射调用NestedScrollView的AppBarLayout.Behavior的私有方法animateOffsetTo。此方法的速度参数会影响动画持续时间。

private void expandAppBarLayoutWithVelocity(AppBarLayout.Behavior behavior, CoordinatorLayout coordinatorLayout, AppBarLayout appBarLayout, float velocity) {
    try {
        //With reflection, we can call the private method of Behavior that expands the AppBarLayout with specified velocity
        Method animateOffsetTo = AppBarLayout.Behavior.getClass().getDeclaredMethod("animateOffsetTo", CoordinatorLayout.class, AppBarLayout.class, int.class, float.class);
        animateOffsetTo.setAccessible(true);
        animateOffsetTo.invoke(behavior, coordinatorLayout, appBarLayout, 0, velocity);
    } catch (Exception e) {
        e.printStackTrace();
        //If the reflection fails, we fall back to the public method setExpanded that expands the AppBarLayout with a fixed velocity
        Log.e(TAG, "Failed to get animateOffsetTo method from AppBarLayout.Behavior through reflection. Falling back to setExpanded.");
        appBarLayout.setExpanded(true, true);
    }
}

要获取行为,您需要从AppBarLayout的LayoutParams中获取它。

AppBarLayout appBarLayout = (AppBarLayout)findViewById(R.id.app_bar);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = params.getBehavior();

答案 1 :(得分:2)

使用动画使用扩展

 AppBarLayout.setExpanded(true,true);

使用动画使用折叠

 AppBarLayout.setExpanded(false,true);