Подтвердить что ты не робот

Как я могу контролировать скорость прокрутки 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...

4b9b3361

Ответ 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();

этот код сделал одну вторую задержку для вашего ресайклера