Я использую CollapsingToolbarLayout в своем приложении на Android. API для 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.
Вы можете вызвать частный метод animateOffsetTo из AppBarLayout.Behavior вашего NestedScrollView с отражением. Этот метод имеет параметр скорости, который влияет на продолжительность анимации.
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);
}
}
Чтобы получить Поведение, вам нужно извлечь его из LayoutParams вашего AppBarLayout.
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);
compile 'com.android.support:design:23.1.0'
, я боюсь. Это поведение было недавно введено Google, подробнее здесь: stackoverflow.com/questions/33892376/…