with scrollflags example coordinatorlayout collapsing appbarlayout android android-design-library android-collapsingtoolbarlayout

scrollflags - expandable toolbar android



Android CollapsingToolbarLayout collapse Listener (10)

Comparto la implementación completa, basada en @Frodio Beggins y el código @Nifhel:

public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener { public enum State { EXPANDED, COLLAPSED, IDLE } private State mCurrentState = State.IDLE; @Override public final void onOffsetChanged(AppBarLayout appBarLayout, int i) { if (i == 0) { if (mCurrentState != State.EXPANDED) { onStateChanged(appBarLayout, State.EXPANDED); } mCurrentState = State.EXPANDED; } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { if (mCurrentState != State.COLLAPSED) { onStateChanged(appBarLayout, State.COLLAPSED); } mCurrentState = State.COLLAPSED; } else { if (mCurrentState != State.IDLE) { onStateChanged(appBarLayout, State.IDLE); } mCurrentState = State.IDLE; } } public abstract void onStateChanged(AppBarLayout appBarLayout, State state); }

Y luego puedes usarlo:

appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { @Override public void onStateChanged(AppBarLayout appBarLayout, State state) { Log.d("STATE", state.name()); } });

Estoy usando CollapsingToolBarLayout junto con AppBarLayout y CoordinatorLayout , y están funcionando bien por completo. Configuré mi Toolbar de Toolbar para que se repare cuando me desplazo hacia arriba, quiero saber si hay una manera de cambiar el texto del título de la barra de herramientas, cuando CollapsingToolBarLayout está contraída.

En resumen, quiero dos títulos diferentes cuando se desplazan y se expanden .

Gracias a todos de antemano


El valor de compensación de mi barra de herramientas obtiene -582 cuando se contrae, al expandir = 0 Así que encuentro el valor al establecer el valor de compensación en Toast y cambiar el código en consecuencia.

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if(verticalOffset == -582) { Toast.makeText(MainActivity.this, "collaped" + verticalOffset, Toast.LENGTH_SHORT).show(); mCollapsingToolbarLayout.setTitle("Collapsed"); }else if(verticalOffset == 0){ Toast.makeText(MainActivity.this, "expanded" + verticalOffset, Toast.LENGTH_SHORT).show(); mCollapsingToolbarLayout.setTitle("expanded"); } } });


Esta solución me está funcionando:

@Override public void onOffsetChanged(AppBarLayout appBarLayout, int i) { if (i == 0) { if (onStateChangeListener != null && state != State.EXPANDED) { onStateChangeListener.onStateChange(State.EXPANDED); } state = State.EXPANDED; } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { if (onStateChangeListener != null && state != State.COLLAPSED) { onStateChangeListener.onStateChange(State.COLLAPSED); } state = State.COLLAPSED; } else { if (onStateChangeListener != null && state != State.IDLE) { onStateChangeListener.onStateChange(State.IDLE); } state = State.IDLE; } }

Use addOnOffsetChangedListener en AppBarLayout.


Esta solución me funciona perfectamente para detectar AppBarLayout colapsado o expandido.

appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0) { // Collapsed } else { //Expanded } } });

Se usó addOnOffsetChangedListener en AppBarLayout .


Este código está funcionando perfecto para mí. Puedes usar la escala de porcentaje como quieras

@Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { double percentage = (double) Math.abs(verticalOffset) / collapsingToolbar.getHeight(); if (percentage > 0.8) { collapsingToolbar.setTitle("Collapsed"); } else { collapsingToolbar.setTitle("Expanded"); } }


Este código me funcionó

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset == -mCollapsingToolbarLayout.getHeight() + mToolbar.getHeight()) { //toolbar is collapsed here //write your code here } } });


Puede obtener el porcentaje alfa de colapsarToolBar usando a continuación:

appbarLayout.addOnOffsetChangedListener( new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { float percentage = ((float)Math.abs(verticalOffset)/appBarLayout.getTotalScrollRange()); fadedView.setAlpha(percentage); });

Para referencia: link


Si está utilizando CollapsingToolBarLayout puede poner esto

collapsingToolbar.setExpandedTitleColor(ContextCompat.getColor(activity, android.R.color.transparent)); collapsingToolbar.setTitle(title);


OnOffsetChangedListener un OnOffsetChangedListener a su AppBarLayout . Cuando verticalOffset alcanza 0 o menos que la altura de la Toolbar , significa que CollapsingToolbarLayout se ha contraído, de lo contrario se está expandiendo o expandiendo.

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if(verticalOffset == 0 || verticalOffset <= mToolbar.getHeight() && !mToolbar.getTitle().equals(mCollapsedTitle)){ mCollapsingToolbar.setTitle(mCollapsedTitle); }else if(!mToolbar.getTitle().equals(mExpandedTitle)){ mCollapsingToolbar.setTitle(mExpandedTitle); } } });


private enum State { EXPANDED, COLLAPSED, IDLE } private void initViews() { final String TAG = "AppBarTest"; final AppBarLayout mAppBarLayout = findViewById(R.id.appbar); mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { private State state; @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset == 0) { if (state != State.EXPANDED) { Log.d(TAG,"Expanded"); } state = State.EXPANDED; } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { if (state != State.COLLAPSED) { Log.d(TAG,"Collapsed"); } state = State.COLLAPSED; } else { if (state != State.IDLE) { Log.d(TAG,"Idle"); } state = State.IDLE; } } }); }