1

I have created a RecyclerView ItemTouchHelper like this -

public class MyItemTouchHelper extends android.support.v7.widget.helper.ItemTouchHelper.SimpleCallback {
private final Paint p;
Context mContext;

@Override
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
    return viewHolder.itemView.getWidth()/3;
}

public MyItemTouchHelper(Context context) {
    super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
    mContext = context;
    p = new Paint();

}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    return false;
}


@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    int position = viewHolder.getAdapterPosition();

    if (direction == ItemTouchHelper.LEFT) {
    } else {
    }
}


@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder
        viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    Bitmap icon;
    String text = "Like it, remind me!";

    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        View itemView = viewHolder.itemView;

        float height = (float) itemView.getBottom() - (float) itemView.getTop();
        float width = height / 10;
        if (dX > 0) {
            p.setColor(Color.parseColor("#388E3C"));

            RectF background = new RectF((float) itemView.getLeft(), (float) itemView.getTop(), dX/3, (float) itemView.getBottom());
            c.drawRect(background, p);

            Rect r = new Rect();
            p.getTextBounds(text, 0, text.length(), r);
            float yPos = height/2;

            yPos += (Math.abs(r.height()))/2;
            int xPos = (c.getWidth() / 2);
            p.setTextAlign(Paint.Align.CENTER);
            c.drawText(text,(float)xPos  , yPos, p);
        } else {
            p.setColor(Color.parseColor("#D32F2F"));

            RectF background = new RectF((float) itemView.getRight() + dX, (float) itemView.getTop(), (float) itemView.getRight(), (float) itemView.getBottom());
            c.drawRect(background, p);


            RectF icon_dest = new RectF((float) itemView.getRight() - 2 * width, (float) itemView.getTop() + width, (float) itemView.getRight() - width, (float) itemView.getBottom() - width);
        }

    }
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

}

}

But this is swiping the whole row off the screen, I only want 25% of row to displace. Let me know of any hint to go forward..

Darpan
  • 5,623
  • 3
  • 48
  • 80
  • I have used below library to implement. https://github.com/droidxiao/SwipeMenuRecyclerView [![This is view after swipe ](https://i.stack.imgur.com/dJPj8.png)](https://i.stack.imgur.com/dJPj8.png) So when you swipe left, the right view sits on top of left. It means left view wont leave the screen. It is view coming from right that blocks the left view. So in the view's xml file coming from right, make android:layout_gravity= "right" (Keeps all view to the right, so that it won't block the left view). Hope it Helps.....! – Praful C Mar 23 '17 at 11:18

1 Answers1

2

Override onChildDraw and divide dX by a factor greater than one before passing it to the super.onChildDraw method. For a view holder moved dX by the swipe, it'll be drawn on screen as moved dX / factor.

Erik
  • 4,305
  • 3
  • 36
  • 54