
이전 작성글에 이어서 이번에는 item을 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도 변경해주었다.
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해 범위를 설정해 줄 수 있다.