support studio recyclerview library instalar features dependency como android android-5.0-lollipop android-support-library android-recyclerview

studio - Android: Control de desplazamiento suave sobre la vista del reciclador



recyclerview dependency (3)

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! En este momento, Recyclerview por defecto es rápido.

ACTUALIZAR:

Resumí la respuesta de Gil con this


No está claro a qué te refieres cuando dices " smoothScroll ". Podría estar refiriéndose al " smoothScrollToPosition " automático, que se desplazará automáticamente a una posición específica, podría estar hablando de desplazamiento manual y podría estar hablando de lanzamientos. Por el bien de la prosperidad, intentaré responder a todas estas cuestiones ahora.

1. Desplazamiento suave automático.

Dentro de su administrador de diseño, necesita 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, uso un método auxiliar llamado "calculaCurrentDistanceToPosition". Esto puede ser un poco complicado, ya que implica mantener un seguimiento de su posición de desplazamiento actual y calcular la posición de desplazamiento de una posición y dada. Puede encontrar un ejemplo de cómo realizar un seguimiento del desplazamiento del reciclador here .

El cálculo del desplazamiento y de una posición dada depende realmente de lo que muestre su reciclador. Suponiendo que todos sus artículos tienen la misma altura, puede calcular esto realizando el siguiente cálculo:

targetScrollY = targetPosition * itemHeight

Luego, para calcular la distancia que necesita para desplazarse, simplemente reste el desplazamiento actual y con el desplazamiento objetivo y:

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

2. Ralentización del desplazamiento manual.

Una vez más, necesita editar su administrador 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; }

Edición: 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 capturar el estado de desplazamiento mediante algún patrón de interfaz.

3. Ralentizar la velocidad de lanzamiento

Aquí quieres bajar la velocidad del lanzamiento. Deberá 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ó ninguno de sus códigos ni proporcionó mucha información sobre su configuración, pero espero que esto cubra la mayoría de las bases y lo ayude a encontrar la mejor solución para usted.


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); } };


Simplemente simplifico Respondiendo cómo usarlo 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 reemplazando 0.7 a su valor.

Ahora usa esta clase en tu XML de esta manera.

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

Leer RecyclerView en Java como.

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