Une question simple, mais je ne trouve pas de réponse. Comment puis-je réduire ou développer le CollapsingToolbarLayout
programmation?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
À 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]); } }
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);