>

LinearSnapHelper를 사용하여 RecyclerView의 항목을 화면의 "스냅"으로 만듭니다 (카드가 화면의 대부분을 차지하므로 모든 스 와이프/플링에서 화면을 제자리에 채우고 채우기를 원합니다)/scroll).

카드를빠르게제자리에 끼우는 방법에 어려움을 겪고 있습니다. 사용자 정의 LinearLayoutManager를 작성하고 (scrollToPosition 또는 smoothScrollToPosition에서 calculateSpeedPerPixel 메소드를 편집하고) 사용자 정의 RecyclerView (및 fling 메소드를 편집)를 시도했습니다. 그러나 카드가 제자리에 들어가는 속도에는 영향을 미치지 않습니다.

나는 문제가 LinearSnapHelper가 어떻게 카드를 제자리에 "스크롤"하는지 이해하지 못한다고 생각합니다. LinearLayoutManager의 scrollToPosition 또는 smoothScrollToPosition 메서드를 사용하지 않는 것 같습니다.

도움이 있습니까? 많은 감사합니다!

   snapHelper = new LinearSnapHelper() {
        @Override
        public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
            View centerView = findSnapView(layoutManager);
            if (centerView == null) {
                return RecyclerView.NO_POSITION;
            }
            int position = layoutManager.getPosition(centerView);
            int targetPosition = -1;
            if (layoutManager.canScrollHorizontally()) {
                if (velocityX < 0) {
                    targetPosition = position - 1;
                } else {
                    targetPosition = position + 1;
                }
            }
            if (layoutManager.canScrollVertically()) {
                if (velocityY > 0) {
                    targetPosition = position + 1;
                } else {
                    targetPosition = position - 1;
                }
            }
            final int firstItem = 0;
            final int lastItem = layoutManager.getItemCount() - 1;
            targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
            return targetPosition;
        }
    };
    snapHelper.attachToRecyclerView(mRecyclerView);

  • 답변 # 1

    郭玉龙이 언급했듯이 SnapHelper는 RecyclerView.smoothScrollBy () 메서드를 호출합니다. 그리고 기본 sQuinticInterpolator를 사용합니다. 스냅 속도를 변경하려면 다음을 수행하십시오.

    public class SlowdownRecyclerView extends RecyclerView {
    // Change pow to control speed.
    // Bigger = faster. RecyclerView default is 5.
    private static final int POW = 2;
    private Interpolator interpolator;
    public SlowdownRecyclerView(Context context) {
        super(context);
        createInterpolator();
    }
    public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        createInterpolator();
    }
    public SlowdownRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        createInterpolator();
    }
    private void createInterpolator(){
        interpolator = new Interpolator() {
            @Override
            public float getInterpolation(float t) {
                t = Math.abs(t - 1.0f);
                return (float) (1.0f - Math.pow(t, POW));
            }
        };
    }
    @Override
    public void smoothScrollBy(int dx, int dy) {
        super.smoothScrollBy(dx, dy, interpolator);
    }
    
    

    나만의 보간기를 구현할 수 있습니다.

  • 답변 # 2

    스냅 핑 스크롤 속도는 RecyclerView.smoothScrollBy() 의 영향을받습니다. .

    소스 코드 스 니펫입니다.

    스냅 핑 스크롤 속도를 높이거나 낮추려면이 함수를 재정의하십시오.

  • 답변 # 3

    RecycleView에 ScrollListener를 추가 한 다음 사용자 정의 LinearLayoutManager 및 사용자 정의 smoothScrollToPosition 메소드를 작성하여이 작업을 마무리했습니다.

       final CustomLinearLayoutManager mLayoutManager = new CustomLinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            private boolean scrollingUp;
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                scrollingUp = dy < 0;
            }
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    int visiblePosition = scrollingUp ? mLayoutManager.findFirstVisibleItemPosition() : mLayoutManager.findLastVisibleItemPosition();
                    int completelyVisiblePosition = scrollingUp ? mLayoutManager
                            .findFirstCompletelyVisibleItemPosition() : mLayoutManager
                            .findLastCompletelyVisibleItemPosition();
                    if (visiblePosition != completelyVisiblePosition) {
                        recyclerView.smoothScrollToPosition(visiblePosition);
                        return;
                    }
            }
        });
    
    

  • 답변 # 4

    실제로 기존 코드를 복사/붙여 넣기 만하면 LinearSnapHelper 및 SnapHelperClass를 수정할 수 있습니다. 원하는대로 SnapHelper에서 MILLISECONDS_PER_INCH를 설정 한 다음 생성 한 LinearSnapHelper를 사용하면됩니다.

  • 이전 html5 - 자바 스크립트로 만든 이미지를 클립 보드에 복사
  • 다음 reactjs - React에서 사용자 세션을 관리하는 가장 좋은 방법은 무엇입니까?