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.
- Eliminar un elemento de RecyclerView- Android
- Android: Añadir divisor entre los elementos de RecyclerView
- ¿Cómo mostrar una vista vacía con RecyclerView?
- RecyclerView autofit LayoutManager
- Cuando el fragmento de interruptor con SwipeRefreshLayout durante la actualización, el fragmento se congela pero en realidad todavía funciona
ACTUALIZAR:
He Resumido Gil Responder con esto
- ANDROID: Múltiples vistas de tarjeta dentro de la vista de reciclador
- ¿Cómo centrar los elementos de una revista de reciclaje?
- Cómo agregar Android Support v7 bibliotecas en eclipse?
- Transición de elementos compartidos de Android entre fragmentos con vista de reciclaje y detalles
- Enlace de Datos de Android: Lista de Observables al Adaptador de RecyclerView
- Android Recycler filtro adaptador de vista con animación
- ¿Cómo usar ButterKnife OnItemClick con RecyclerView?
- RecyclerView 23.2.x height = 0dp hace que onBind llame a todos los elementos y scrollToPosition no funciona
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); } };
- ¿Cómo puedo encontrar el número de años entre dos fechas en android?
- Carga de Android desde la URL a Bitmap