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
Usar CoordinatorLayout es la mejor manera. Sin embargo, si desea adjuntar oyente a ListView o RecyclerView, también puede hacerlo. Creo que es más personalizable. Aquí está mi ejemplo en git hub.
Proyecto Github: Ocultar FAB (Biblioteca de materiales) con listview
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