我在Android应用程序中使用了CollapsingToolbarLayout。我的应用程序的最低要求API是9。
当用户点击折叠的工具栏时,我需要展开折叠的工具栏,就像在最新的Gmail日历应用中一样。所以我设置了一个onClickListener,在其中我执行以下操作:
public void onClick(View v) {
if(toolbarExpanded) {
mAppBar.setExpanded(false, true);
} else {
mAppBar.setExpanded(true, true);
}
toolbarExpanded = !toolbarExpanded;
}
哪个效果很好,但我的问题是它运行的动画很慢,这意味着用户体验不佳。
是否有更改持续时间或为此定义自定义动画?
提前谢谢。
答案 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);