android - una - ¿Cómo hacer que la barra de herramientas aparezca o desaparezca al usar Google Design Library?
google toolbar chrome (3)
Estoy tratando de lograr un efecto como el de WhatsApp, donde la barra de herramientas (cuando se desplaza) se recortará para verse como un imán, o fuera de vista como un imán.
Lo que tengo en mi XML de MainActivity:
- DrawerLayout - Diseño base
- CoordinatorLayout - Diseño para la barra de aplicaciones y la barra de herramientas y pestañas
- AppBarLayout: para mantener presionada la barra de herramientas y las pestañas
- Barra de herramientas - tiene ESTA bandera:
app:layout_scrollFlags="scroll|enterAlways"
- SlidingTabLayout: muestra pestañas
- ViewPager: para pestañas
- RecyclerView - Para coordinatorlayout
Ahora no me malinterprete, funciona, cuando me desplazo hacia abajo, la barra de herramientas se aleja de la vista, pero digo que dejo de desplazarme hasta la mitad, luego la barra de herramientas se queda allí medio escondida fuera de la vista y la otra mitad a la vista.
¿Cómo puedo abordar la solución de este problema, ya que quiero que desaparezca de la vista o se vea?
Acabo de ocultar el diseño de la barra de acciones en la actividad principal y establecí el lapso para CollapsingToolbarLayout. esto funciona para mi.
en la actividad principal
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().hide();
CollapsingToolbarLayout collapsingToolbar =
(CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingToolbar.setTitle("Name");
loadBackdrop();
y layout_activity_main
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="@dimen/detail_backdrop_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|snap"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
Esta característica se ha agregado en la versión 23.1.0
de la biblioteca de soporte de Android. Desde notas de la versión:
Se agregó soporte de ajuste de bordes a la clase AppBarLayout al agregar la constante SCROLL_FLAG_SNAP. Cuando el desplazamiento finaliza, si la vista solo se ve parcialmente, la vista se ajusta y se desplaza al borde más cercano.
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways|snap" />
-----
-----
Para más información: http://android-developers.blogspot.in/2015/10/android-support-library-231.html
EDITAR: Se agregó una comilla final a layout_scrollFlags para hacer esto sintácticamente correcto
EDITAR: a partir del soporte 23.1.0 esto ya no es necesario. Ver esta respuesta en su lugar.
Una forma posible de resolver esto es personalizar el conjunto de Behavior
en su AppBarLayout
.
<android.support.design.widget.AppBarLayout
app:layout_behavior="com.myapp.AppBarLayoutSnapBehavior"
android:layout_width="match_parent"
android:layout_height="wrap_content">
...
Su AppBarLayoutSnapBehavior
cambiaría el comportamiento predeterminado de AppBarLayout.Behavior
, al agregar la lógica de complemento cuando se detiene el desplazamiento. Con suerte, el siguiente código se explica por sí mismo.
package com.myapp;
public class AppBarLayoutSnapBehavior extends AppBarLayout.Behavior {
private ValueAnimator mAnimator;
private boolean mNestedScrollStarted = false;
public AppBarLayoutSnapBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
View directTargetChild, View target, int nestedScrollAxes) {
mNestedScrollStarted = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
if (mNestedScrollStarted && mAnimator != null) {
mAnimator.cancel();
}
return mNestedScrollStarted;
}
@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target) {
super.onStopNestedScroll(coordinatorLayout, child, target);
if (!mNestedScrollStarted) {
return;
}
mNestedScrollStarted = false;
int scrollRange = child.getTotalScrollRange();
int topOffset = getTopAndBottomOffset();
if (topOffset <= -scrollRange || topOffset >= 0) {
// Already fully visible or fully invisible
return;
}
if (topOffset < -(scrollRange / 2f)) {
// Snap up (to fully invisible)
animateOffsetTo(-scrollRange);
} else {
// Snap down (to fully visible)
animateOffsetTo(0);
}
}
private void animateOffsetTo(int offset) {
if (mAnimator == null) {
mAnimator = new ValueAnimator();
mAnimator.setInterpolator(new DecelerateInterpolator());
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setTopAndBottomOffset((int) animation.getAnimatedValue());
}
});
} else {
mAnimator.cancel();
}
mAnimator.setIntValues(getTopAndBottomOffset(), offset);
mAnimator.start();
}
}
Lo único es que la vista de desplazamiento (en mi caso, un RecyclerView
) se ajusta junto con la Toolbar
. De hecho, me gusta de esta manera, pero no estoy seguro de que sea eso lo que quieres.