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

Я использую CollapsingToolbarLayout в своем приложении на Android. Минимальное требование API моего приложения — 9.

Мне нужно, чтобы свернутая панель инструментов расширялась, когда пользователь щелкает ее, как в последнем приложении Gmail Calendar. Итак, я установил onClickListener и внутри него делаю следующее:

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

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

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

Заранее спасибо.


person Ignacio Ruiz    schedule 30.12.2015    source источник
comment
Боюсь, обходным путем является откат к compile 'com.android.support:design:23.1.0'. Это поведение было недавно представлено Google, подробнее читайте здесь: stackoverflow.com/questions/33892376/   -  person Konstantin Loginov    schedule 30.12.2015


Ответы (2)


Примечание. этот ответ основан на библиотеке дизайна Android версии 25.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();
person Raphael Royer-Rivard    schedule 21.11.2016
comment
Работает отлично, как я могу программно свернуть #Raphael Royer-Rivard - person Anbarasu Chinna; 21.07.2017

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

 AppBarLayout.setExpanded(true,true);

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

 AppBarLayout.setExpanded(false,true);
person Anbarasu Chinna    schedule 21.07.2017