Как я могу контролировать скорость прокрутки recyclerView.smoothScrollToPosition(позиция)
У меня есть просмотр recycler... и я хочу, чтобы плавный прокрутка, а затем прокручиваю его программно, чтобы показать полный контент в нем пользователю....
И я могу это сделать
final int height=recyclerView.getChildAt(0).getHeight();
recyclerView.smoothScrollToPosition(height);
recyclerView.postDelayed(new Runnable() {
public void run() {
recyclerView.smoothScrollToPosition(0);
}
},200);
но то, что я хочу, - это... замедлить скорость прокрутки, чтобы полный контент стал видимым. Так, может кто-то поможет мне найти его.
спасибоs...
Ответы
Ответ 1
Просто немного поправьте ответ:
public class SpeedyLinearLayoutManager extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 5f; //default is 25f (bigger = slower)
public SpeedyLinearLayoutManager(Context context) {
super(context);
}
public SpeedyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public SpeedyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return SpeedyLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}
Ответ 2
Я нашел ответ!
Вам нужно создать собственный класс, расширяющий [LinearLayoutManager][1]
, а затем переопределить метод [smoothScrollToPosition][1]
. Внутри вам нужно создать новый [LinearSmoothScroller][1]
и переопределить его метод calculateSpeedPerPixel. Затем используйте LinearSmoothScroller
для завершения прокрутки.
Вот мой пример:
public class CustomLinearLayoutManager extends LinearLayoutManager{
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
final LinearSmoothScroller linearSmoothScroller =
new LinearSmoothScroller(recyclerView.getContext()) {
private static final float MILLISECONDS_PER_INCH = 100f;
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return CustomLinearLayoutManager.this
.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel
(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}
Назначьте это CustomLinearLayoutManager
вашему RecyclerView
, и вам должно быть хорошо идти. Дайте мне знать, если я ничего не понял. Я буду рад помочь.
Ответ 3
Я сделал версию, в которой вы можете установить переменную скорости прокрутки.
Если вы установите для параметра factor
значение 2, оно будет в два раза медленнее, чем значение по умолчанию.
public class VariableScrollSpeedLinearLayoutManager extends LinearLayoutManager {
private final float factor;
public VariableScrollSpeedLinearLayoutManager(Context context, float factor) {
super(context);
this.factor = factor;
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return VariableScrollSpeedLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return super.calculateSpeedPerPixel(displayMetrics) * factor;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}
Ответ 4
Для тех, кто не заинтересован в переопределении LinearLayoutManager (или в зависимости от того, какой подкласс вы используете), вы можете просто вызвать startSmoothScroll(smoothScroller)
непосредственно в менеджере компоновки.
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
layoutManager.startSmoothScroll(linearSmoothScroller);
Ответ 5
я нашел сложное решение для этого вопроса
мы можем использовать CountDownTimer, он работает...
new CountDownTimer(1000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
recyclerViewSelectionTest.scrollToPosition(position + 1);
}
}.start();
этот код сделал одну вторую задержку для вашего ресайклера