CollapsingToolbarLayout 以编程方式扩展动画持续时间
CollapsingToolbarLayout expand programmatically animation duration
我在 Android 的应用程序中使用了 CollapsingToolbarLayout。我的应用程序的最低要求 API 是 9.
我需要折叠的工具栏在用户单击折叠工具栏时展开,就像在最新的 Gmail 日历应用程序中一样。所以我设置了一个 onClickListener 并在其中执行以下操作:
public void onClick(View v) {
if(toolbarExpanded) {
mAppBar.setExpanded(false, true);
} else {
mAppBar.setExpanded(true, true);
}
toolbarExpanded = !toolbarExpanded;
}
它工作得很好,但我的问题是它 运行 的动画很慢,这意味着糟糕的用户体验。
是否可以更改持续时间或为此定义自定义动画?
提前致谢。
注:本回答基于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);
}
}
要获取 Behavior,您需要从 AppBarLayout 的 LayoutParams 中获取它。
AppBarLayout appBarLayout = (AppBarLayout)findViewById(R.id.app_bar);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = params.getBehavior();
使用动画扩展
AppBarLayout.setExpanded(true,true);
使用动画折叠
AppBarLayout.setExpanded(false,true);
我在 Android 的应用程序中使用了 CollapsingToolbarLayout。我的应用程序的最低要求 API 是 9.
我需要折叠的工具栏在用户单击折叠工具栏时展开,就像在最新的 Gmail 日历应用程序中一样。所以我设置了一个 onClickListener 并在其中执行以下操作:
public void onClick(View v) {
if(toolbarExpanded) {
mAppBar.setExpanded(false, true);
} else {
mAppBar.setExpanded(true, true);
}
toolbarExpanded = !toolbarExpanded;
}
它工作得很好,但我的问题是它 运行 的动画很慢,这意味着糟糕的用户体验。
是否可以更改持续时间或为此定义自定义动画?
提前致谢。
注:本回答基于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);
}
}
要获取 Behavior,您需要从 AppBarLayout 的 LayoutParams 中获取它。
AppBarLayout appBarLayout = (AppBarLayout)findViewById(R.id.app_bar);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = params.getBehavior();
使用动画扩展
AppBarLayout.setExpanded(true,true);
使用动画折叠
AppBarLayout.setExpanded(false,true);