CollapsingToolbarLayout программно увеличивает продолжительность анимации

1

Я использую 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;
 }

Что работает довольно хорошо, но моя проблема в том, что анимация, которую он работает, медленная, что означает плохой пользовательский интерфейс.

Есть ли способ изменить продолжительность или определить пользовательскую анимацию для этого?

Спасибо заранее.

  • 1
    Обходной путь - откат для compile 'com.android.support:design:23.1.0' , я боюсь. Это поведение было недавно введено Google, подробнее здесь: stackoverflow.com/questions/33892376/…
Теги:
animation
appbar
collapsingtoolbarlayout

2 ответа

3
Лучший ответ

Примечание: этот ответ основан на библиотеке дизайна 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();
  • 1
    Работает отлично, Как я могу программно свернуть # Рафаэль Ройер-Ривард
1

Для расширения с использованием анимации

 AppBarLayout.setExpanded(true,true);

Чтобы свернуть с использованием анимации

 AppBarLayout.setExpanded(false,true);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню