Android: Control Desplazamiento suave sobre la vista del reciclador

Estoy usando Recyclerview con CardView. Soy consciente de cómo controlar la velocidad en la vista de lista. Pero no para Recyclerview.

Busqué mucho en el nombre de clase encontrado SmoothScroll . ¿Cómo usar eso? ¡No tengo idea! Ahora Recyclerview por defecto es rápido.

ACTUALIZAR:

He Resumido Gil Responder con esto

No está claro lo que quieres decir cuando dices " smoothScroll ". Podría estar refiriéndose a la " smoothScrollToPosition " automática que se desplazará automáticamente a una posición especificada, podría estar hablando de desplazamiento manual y podría estar hablando de arrastrar. Por el bien de la prosperidad, voy a tratar de responder a todos estos problemas ahora.

1. Desplazamiento suave automático.

Dentro de su gestor de diseño, debe implementar el método smoothScrollToPosition :

  @Override public void smoothScrollToPosition(RecyclerView recyclerView, State state, int position) { // A good idea would be to create this instance in some initialization method, and just set the target position in this method. LinearSmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) { @Override public PointF computeScrollVectorForPosition(int targetPosition) { int yDelta = calculateCurrentDistanceToPosition(targetPosition); return new PointF(0, yDelta); } // This is the important method. This code will return the amount of time it takes to scroll 1 pixel. // This code will request X milliseconds for every Y DP units. @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { return X / TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, Y, displayMetrics); } }; smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } 

En este ejemplo, utilizo un método auxiliar denominado "calculateCurrentDistanceToPosition". Esto puede ser un poco complicado, ya que implica seguir la pista de su posición de desplazamiento actual, y el cálculo de la posición de desplazamiento de una determinada posición y. Puede encontrar un ejemplo de cómo realizar un seguimiento de la ruta del reciclador aquí .

El cálculo de la voluta de una determinada posición depende realmente de lo que esté mostrando su reciclador. Suponiendo que todos sus elementos tienen la misma altura, puede calcularlo realizando el siguiente cálculo:

 targetScrollY = targetPosition * itemHeight 

A continuación, para calcular la distancia que necesita desplazarse, simplemente resta la actual y con la orientación y:

 private int calculateCurrentDistanceToPosition(int targetPosition) { int targetScrollY = targetPosition * itemHeight; return targetScrollY - currentScrollY; } 

2. Desaceleración del desplazamiento manual.

Una vez más, necesita editar su gestor de diseño, esta vez – el método scrollVerticallyBy :

  @Override public int scrollVerticallyBy(int delta, Recycler recycler, State state) { // write your limiting logic here to prevent the delta from exceeding the limits of your list. int prevDelta = delta; if (getScrollState() == SCROLL_STATE_DRAGGING) delta = (int)(delta > 0 ? Math.max(delta * MANUAL_SCROLL_SLOW_RATIO, 1) : Math.min(delta * MANUAL_SCROLL_SLOW_RATIO, -1)); // MANUAL_SCROLL_SLOW_RATIO is between 0 (no manual scrolling) to 1 (normal speed) or more (faster speed). // write your scrolling logic code here whereby you move each view by the given delta if (getScrollState() == SCROLL_STATE_DRAGGING) delta = prevDelta; return delta; } 

Editar: En el método anterior, llamo " getScrollState() ". Este es un método de RecyclerView . En esta implementación, mi LayoutManager personalizado es una clase anidada de mi RecyclerView personalizado. Si esto no funciona para usted, puede intentar tomar el estado de desplazamiento a través de algún patrón de interfaz.

3. Reduzca la velocidad de lanzamiento

Aquí se desea reducir la velocidad de fling. Necesitará anular el método de fling dentro de su subclase RecyclerView:

 @Override public boolean fling(int velocityX, int velocityY) { velocityY *= FLING_SCALE_DOWN_FACTOR; // (between 0 for no fling, and 1 for normal fling, or more for faster fling). return super.fling(velocityX, velocityY); } 

Es difícil para mí proporcionar una solución más personalizada, ya que no publicó ningún código o proporcionó mucha información acerca de su configuración, pero espero que esto cubre la mayoría de las bases y le ayudará a encontrar la mejor solución para usted.

Simplemente simplificando Responder cómo utilizarlo para controlar el desplazamiento suave.

Crear Clase

 import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; public class CustomRecyclerView extends RecyclerView { Context context; public CustomRecyclerView(Context context) { super(context); this.context = context; } public CustomRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean fling(int velocityX, int velocityY) { velocityY *= 0.7; // velocityX *= 0.7; for Horizontal recycler view. comment velocityY line not require for Horizontal Mode. return super.fling(velocityX, velocityY); } } 

Ajuste la velocidad al reemplazar 0.7 a su valor.

Ahora usa esta clase en tu XML así.

 <<yourpackage>.CustomRecyclerView android:id="@+id/my_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> 

Lea RecyclerView en Java como.

 CustomRecyclerView mRecyclerView; mRecyclerView = (CustomRecyclerView) findViewById(R.id.my_recycler_view); 

Simplemente implemente smoothScrollToPosition () de su LinearLayoutManager:

 LinearLayoutManager layoutManager = new LinearLayoutManager(this) { @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { LinearSmoothScroller smoothScroller = new LinearSmoothScroller(this) { private static final float SPEED = 300f;// Change this value (default=25f) @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { return SPEED / displayMetrics.densityDpi; } }; smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } }; 
  • RecyclerView expandible cardView
  • Arrastrar y soltar elementos en RecyclerView con GridLayoutManager
  • RecyclerView vs. ListView
  • CardView dentro de RecyclerView tiene márgenes adicionales
  • Wrap_content en recycleview, toma altura del elemento (lista horizontal)
  • Uso de CardView y RecyclerView en mis archivos de diseño genera una excepción
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • Cómo obtener clics en RecyclerView (NO los niños)
  • Recyclerview con fondo de desplazamiento
  • Efecto Parallax en cada elemento en una vista de reciclador?
  • Cómo agregar un scroller rápido al RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.