servicio seleccion que mejorada inhabilitar habilitar guia desactivar configuración configuracion como automatica asistente acceso accesibilidad android material-design android-design-library fab

que - inhabilitar seleccion automatica android



Uso de Google Design Library cómo ocultar el botón FAB en ¿Desplazarse hacia abajo? (6)

Google lanzó la biblioteca de diseño, estoy usando

compile ''com.android.support:design:22.2.1''

Sin embargo, no puedo ver ningún ejemplo de código sobre cómo usar esta biblioteca y cómo animar la barra FAB en scroll. Supongo que puedo escuchar eventos de desplazamiento en ListView y luego animar el botón yo mismo, pero ¿esto no está incluido en la API (este no es el objetivo de esta biblioteca de soporte)?

Hay ejemplos?

Gracias


El @ianhanniballake funciona bien, pero los métodos onStartNestedScroll() y onNestedScroll() se desaprobaron. Aquí está la versión actualizada:

public class FabAwareScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { public FabAwareScrollingViewBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return super.layoutDependsOn(parent, child, dependency) || dependency instanceof FloatingActionButton; } @Override public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) { // Ensure we react to vertical scrolling return axes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type); } @Override public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull View child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); if (dy > 0) { // User scrolled down -> hide the FAB List<View> dependencies = coordinatorLayout.getDependencies(child); for (View view : dependencies) { if (view instanceof FloatingActionButton) { ((FloatingActionButton) view).hide(); } } } else if (dy < 0) { // User scrolled up -> show the FAB List<View> dependencies = coordinatorLayout.getDependencies(child); for (View view : dependencies) { if (view instanceof FloatingActionButton) { ((FloatingActionButton) view).show(); } } } } }

También hay una muy buena publicación de @ianhanniballake sobre este tema: Interceptar todo con CoordinatorLayout Behaviors


Hacer que un componente reaccione a los eventos de desplazamiento se realiza más fácilmente con un CoordinatorLayout.Behavior personalizado, ya que reciben eventos de desplazamiento automáticamente cuando anulas onStartNestedScroll() .

Un ejemplo de comportamiento que oculta y muestra el FAB en desplazamiento encontrado en este FABAwareScrollingViewBehavior , construido sobre cheesesquare :

public class FABAwareScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { public FABAwareScrollingViewBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return super.layoutDependsOn(parent, child, dependency) || dependency instanceof FloatingActionButton; } @Override public boolean onStartNestedScroll( final CoordinatorLayout coordinatorLayout, final View child, final View directTargetChild, final View target, final int nestedScrollAxes) { // Ensure we react to vertical scrolling return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } @Override public void onNestedScroll( final CoordinatorLayout coordinatorLayout, final View child, final View target, final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); if (dyConsumed > 0) { // User scrolled down -> hide the FAB List<View> dependencies = coordinatorLayout.getDependencies(child); for (View view : dependencies) { if (view instanceof FloatingActionButton) { ((FloatingActionButton) view).hide(); } } } else if (dyConsumed < 0) { // User scrolled up -> show the FAB List<View> dependencies = coordinatorLayout.getDependencies(child); for (View view : dependencies) { if (view instanceof FloatingActionButton) { ((FloatingActionButton) view).show(); } } } } }

Donde su vista de desplazamiento tendría la app:layout_behavior="com.support.android.designlibdemo.FABAwareScrollingViewBehavior" lugar de la app:layout_behavior="@string/appbar_scrolling_view_behavior"

Sin embargo, puede reemplazar hide() y show() con cualquier acción si lo desea. Los detalles sobre cómo se hizo esto se pueden encontrar en esta publicación y en la publicación de seguimiento para v22.2.1 y la publicación de seguimiento para v25.1.0 .

Tenga en cuenta que esto, al igual que todos los comportamientos de desplazamiento de la Biblioteca de diseño, requieren que su vista admita el desplazamiento anidado, que actualmente lo limita a NestedScrollView , RecyclerView - ListView y ScrollView solo funcionan en dispositivos API21 +.


Si NO estás utilizando un RecycleView (es decir, solo ScrollView normal), esto hará el truco:

mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { if (mScrollView.getScrollY() > oldScrollYPostion) { fab.hide(); } else if (mScrollView.getScrollY() < oldScrollYPostion || mScrollView.getScrollY() <= 0) { fab.show(); } oldScrollYPostion = mScrollView.getScrollY(); } });

No te olvides de declarar:

private int oldScrollYPostion = 0;

dentro de tu clase


Si está utilizando RecyclerView y está buscando algo simple, puede intentar esto:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy){ if (dy > 0) fabAddNew.hide(); else if (dy < 0) fabAddNew.show(); } });

Al reemplazar 0 con una constante, puede ajustar la sensibilidad de activación, proporcionando una experiencia más fluida



recyclerView.setOnFlingListener(new RecyclerView.OnFlingListener() { @Override public boolean onFling(int velocityX, int velocityY) { if (velocityY < 0) mScrollCallbacks.showUI(); //Code to hide the UI, I have a custom one that slides down the nav bar and the fab else if (velocityY > 0) mScrollCallbacks.hideUI(); //Code to show the UI return false; } });

Esto funciona muy bien