Réduire par programme ou développer CollapsingToolbarLayout

Une question simple, mais je ne trouve pas de réponse. Comment puis-je réduire ou développer le CollapsingToolbarLayout programmation?

barre d'outils réduite

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

barre d'outils étendue

À l’aide de Support Library v23, vous pouvez appeler appBarLayout.setExpanded(true/false) .

Lectures complémentaires: AppBarLayout.setExpanded (boolean)

J’utilise ce code pour réduire la barre d’outils. Je n’arrive toujours pas à trouver un moyen de le développer.

 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); } } 

Edit 1: La même fonction avec vélocité négative mais la barre d’outils n’est pas développée à 100% et false pour le dernier paramètre devrait fonctionner

 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); } } 

Edit 2: Ce code fait le tour pour moi

 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 développe la barre d’outils
  • onNestedPreScroll affiche le contenu dans la barre d’outils développée

Je vais essayer de mettre en œuvre le comportement moi-même.

Vous pouvez définir combien il se développe ou se réduit avec votre animateur personnalisé. Utilisez simplement setTopAndBottomOffset(int) .

Voici un exemple:

 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(); } 

J’ai écrit une petite extension à AppBarLayout . Cela permet d’étendre et de CollapsibleToolbarLayout le CollapsibleToolbarLayout avec et sans animation. Il semble le faire très bien.

N’hésitez pas à l’essayer.

Il suffit de l’utiliser à la place de votre AppBarLayout , et vous pouvez appeler des méthodes responsables de l’extension ou de la CollapsingToolbarLayout .

Cela fonctionne exactement comme prévu dans mon projet, mais vous devrez peut-être modifier les valeurs de fling / scroll dans les méthodes perform... (en particulier dans performExpandingWithAnimation() ) pour s’adapter parfaitement à votre CollapsibleToolbarLayout .

pour ceux qui veulent travailler avec onNestedPreScroll et obtenir des erreurs comme moi. je reçois NullPointerException dans onCreate avec cette ligne

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

et ne fonctionne pas correctement avec cela. mais je travaille autour de ce problème avec

dans onCreate:

  scrollToolbarOnDelay(); 

et…

  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); } 

Utilisez mAppBarLayout.setExpanded(true) pour développer la barre d’outils et utilisez mAppBarLayout.setExpanded(false) pour mAppBarLayout.setExpanded(false) barre d’outils.

Si vous souhaitez modifier CollapsingToolbarLayout height par programmation, utilisez simplement mAppBarLayout.setLayoutParams(params) ;

Développer:

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

Effondrer:

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