FloatingActionButton ocultar en la lista de desplazamiento

Estoy usando el FloatingActionButton del paquete android.support.design.widget :

 <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_marginBottom="20dp" android:layout_marginEnd="16dp" android:clickable="true" android:backgroundTint="@color/primaryColor" android:src="@drawable/ic_search_white_24dp" app:borderWidth="0dp" app:elevation="6dp" app:backgroundTint="@color/primaryColorDark" app:rippleColor="@color/accentColor" /> 

¿Es posible configurar ese botón para ocultarlo con una animación cuando la vista de lista se desplaza hacia abajo y mostrarla de nuevo cuando listview está desplazándose hacia arriba?

Vea esto . Aquí se explica cómo hacer lo que se intenta lograr. Tienes que usarlo así en un CoordinatorLayout y ListView :

 <android.support.design.widget.CoordinatorLayout android:id="@+id/main_content" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lvToDoList" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="16dp" android:src="@drawable/ic_done" app:layout_anchor="@id/lvToDoList" app:layout_anchorGravity="bottom|right|end" /> </android.support.design.widget.CoordinatorLayout> 

Aquellos que buscan hacerlo con recyclerview pueden hacer esto:

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy){ if (dy > 0 ||dy<0 && fab.isShown()) fab.hide(); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE){ fab.show(); } super.onScrollStateChanged(recyclerView, newState); } }); 

Utilizando esta clase que puede animar fácilmente FAB, aquí he implementado onStopNestedScroll () método para mostrar su Fab siempre que la parada de desplazamiento. Fijé 1000 miliSeconds como retardo usando Handler ();

  public class ScrollingFABBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { private static final String TAG = "ScrollingFABBehavior"; Handler mHandler; public ScrollingFABBehavior(Context context, AttributeSet attrs) { super(); } @Override public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, final FloatingActionButton child, View target) { super.onStopNestedScroll(coordinatorLayout, child, target); if (mHandler == null) mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { child.animate().translationY(0).setInterpolator(new LinearInterpolator()).start(); Log.d("FabAnim","startHandler()"); } },1000); } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); //child -> Floating Action Button if (dyConsumed > 0) { Log.d("Scrolling","Up"); CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); int fab_bottomMargin = layoutParams.bottomMargin; child.animate().translationY(child.getHeight() + fab_bottomMargin).setInterpolator(new LinearInterpolator()).start(); } else if (dyConsumed < 0) { Log.d("Scrolling","down"); child.animate().translationY(0).setInterpolator(new LinearInterpolator()).start(); } } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { if(mHandler!=null) { mHandler.removeMessages(0); Log.d("Scrolling","stopHandler()"); } return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; } } 

Your_layout.xml

 <android.support.design.widget.FloatingActionButton android:id="@+id/imageViewYes" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end|right" android:layout_margin="@dimen/fab_margin" android:src="@drawable/ic_yes" app:backgroundTint="@color/white" android:scaleType="center" app:elevation="6dp" app:fabSize="normal" app:layout_behavior="com.your.package.ScrollingFABBehavior" app:pressedTranslationZ="12dp" app:rippleColor="@color/gray" /> 

Hey no hay necesidad de tomar el recyclerview para auto ocultar el botón de acción flotante en el desplazamiento hacia abajo para este propósito podemos usar el listview por defecto con el botón de acción flotante en forma normal sólo hacer modificaciones en escucha listview.onscroll entonces podemos obtener sentir como reciclar

  listview.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastItem = firstVisibleItem + visibleItemCount; if (lastItem == totalItemCount) { fab.setVisibility(View.INVISIBLE); }else { fab.setVisibility(View.VISIBLE); } } }); 

Según me la mejor manera de implementar esto sería como abajo.

 public class ScrollingFABBehavior extends FloatingActionButton.Behavior { private static final String TAG = "ScrollingFABBehavior"; public ScrollingFABBehavior(Context context, AttributeSet attrs) { super(); // Log.e(TAG, "ScrollAwareFABBehavior"); } public boolean onStartNestedScroll(CoordinatorLayout parent, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { return true; } @Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { if (dependency instanceof RecyclerView) return true; return false; } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { // TODO Auto-generated method stub super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); //Log.e(TAG, "onNestedScroll called"); if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { // Log.e(TAG, "child.hide()"); child.hide(); } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { // Log.e(TAG, "child.show()"); child.show(); } }} 

Para una respuesta detallada, compruebe esto. Ocultar FloatingActionButton en el desplazamiento de RecyclerView

Una pequeña mejora al código de Irfan Raza :

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy){ if (dy<-5 && !fab.isShown()) fab.show(); else if(dy>5 && fab.isShown()) fab.hide(); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } }); 

El botón de acción flotante se oculta cuando se desplaza hacia abajo y se muestra al desplazarse hacia arriba.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.