scrollflags coordinatorlayout collapsible collapsemode appbarlayout android collapsingtoolbarlayout android-collapsingtoolbarlayout

android - coordinatorlayout - Colapsar o expandir mediante programación CollapsingToolbarLayout



layout collapsemode parallax (9)

Pregunta simple, pero no puedo encontrar una respuesta. ¿Cómo puedo contraer o expandir el CollapsingToolbarLayout programación?

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


Esto puede ayudar a expandir o colapsar:

appBarLayout.setActivated(true); appBarLayout.setExpanded(true, true);


He escrito una pequeña extensión para AppBarLayout . Permite expandir y contraer CollapsibleToolbarLayout con y sin animación. Parece estar haciéndolo bien.

Siéntase libre de probarlo.

Simplemente utilícelo en lugar de su AppBarLayout , y puede llamar a los métodos responsables de expandir o contraer CollapsingToolbarLayout .

Funciona exactamente como se esperaba en mi proyecto, pero es posible que deba ajustar los valores de desplazamiento / desplazamiento en los métodos de perform... (especialmente en performExpandingWithAnimation() ) para que encajen perfectamente con su CollapsibleToolbarLayout .


Prueba esto...

Expandir

appBarLayout.setExpanded(true, true);

Para recordar

appBarLayout.setExpanded(false, true);


Puede definir cuánto se expande o colapsa con su animador personalizado. Simplemente use setTopAndBottomOffset(int) .

Aquí hay un ejemplo:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams(); final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if (behavior != null) { ValueAnimator valueAnimator = ValueAnimator.ofInt(); valueAnimator.setInterpolator(new DecelerateInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue()); appBar.requestLayout(); } }); valueAnimator.setIntValues(0, -900); valueAnimator.setDuration(400); valueAnimator.start(); }



Use mAppBarLayout.setExpanded(true) para expandir la barra de herramientas y use mAppBarLayout.setExpanded(false) para contraer la barra de herramientas.

Si desea cambiar la altura de CollapsingToolbarLayout mediante programación, simplemente use mAppBarLayout.setLayoutParams(params) ;

Expandir:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*200; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(true);

Colapso:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams(); params.height = 3*80; // HEIGHT mAppBarLayout.setLayoutParams(params); mAppBarLayout.setExpanded(false);


Yo uso este código para colapsar la barra de herramientas. Todavía no puedo encontrar una manera de expandirlo.

public void collapseToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true); } }

Edición 1: la misma función con velocidad negativa Y pero la barra de herramientas no está expandida al 100% y falso para el último parámetro debería funcionar

public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false); } }

Edición 2: este código hace el truco para mí

public void expandToolbar(){ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams(); behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) { behavior.setTopAndBottomOffset(0); behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]); } }

  • setTopAndBottomOffset expande la barra de herramientas
  • onNestedPreScroll muestra el contenido dentro de la barra de herramientas expandida

Intentaré implementar el comportamiento por mí mismo.


he usado esto

private fun collapseAppbar() { scrollView.postDelayed(Runnable { scrollView?.smoothScrollTo(50, 50) }, 400) }


para aquellos que quieren trabajar con onNestedPreScroll y obtener un error como yo. me sale NullPointerException en onCreate sin esta línea

CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); //below line params.setBehavior(new AppBarLayout.Behavior() {});

y no funciona correctamente con esto. pero evito este problema con

en onCreate:

scrollToolbarOnDelay();

y...

public void scrollToolbarOnDelay() { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar); CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if(behavior!=null) behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0}); else scrollToolbarOnDelay() } }, 100); }