Android - RecyclerView의 item 좌우 Swipe 기능(2)

유의선·2024년 4월 21일

이전 작성글에 이어서 이번에는 item을 swipe 할 때 배경이 보여지도록 만들어보았다.


swipe 시킬 때 배경을 남겨두기

먼저 item의 레이아웃을 FrameLayout으로 만들고 움직일 layout과 배경이 될 layout 두개를 만들어 겹쳐두었다.


ItemTouchHelper.Callback()을 상속받는 클래스에 onChildDraw 메소드를 오버라이드한다.
onChildDraw 메소드에서 스와이프 시킬 뷰를 참조하고, getDefaultUIUtil().onDraw 메소드에 스와이프 시킬 뷰를 전달해준다.

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
            View deleteImage = viewHolder.itemView.findViewById(R.id.imageDelete);
            View editImage = viewHolder.itemView.findViewById(R.id.imageEdit);
            View itemView = viewHolder.itemView.findViewById(R.id.itemLayout);
            if(dX > 0){
                deleteImage.setVisibility(View.VISIBLE);
                editImage.setVisibility(View.INVISIBLE);
                getDefaultUIUtil().onDraw(c, recyclerView, itemView, dX, dY, actionState, isCurrentlyActive);
            }else if(dX < 0){
                deleteImage.setVisibility(View.INVISIBLE);
                editImage.setVisibility(View.VISIBLE);
                getDefaultUIUtil().onDraw(c, recyclerView, itemView, dX, dY, actionState, isCurrentlyActive);
            }
        }
    }

swipe 시킬 layout을 참조하여 getDefaultUIUtil().onDraw 메소드에 전달해주었고,
배경의 imageView도 참조하여 swipe 방향에 따라 Visibility도 변경해주었다.


swipe 이벤트 발생 속도, 범위 설정하기.

getSwipeEscapeVelocity 메소드로 swipe 이벤트가 발생하는 속도를,
getSwipeThreshold 메소드로 swipe 이벤트가 발생하는 swipe 범위를 지정해줄 수 있다.

    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
        return defaultValue * 3;
    }
    
    @Override
    public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        return super.getSwipeThreshold(viewHolder);
    }

getSwipeEscapeVelocity에선 기본 값이 defaultValue으로 설정되어있고, 원하는 값을 return 해 속도를 설정해 줄 수 있다.
getSwipeThreshold에선 기본 값이 5f로 설정되어있고, 원하는 값을 return해 범위를 설정해 줄 수 있다.

0개의 댓글