Recycler View swipe с цветом фона и текстом, не отображающим прямоугольник при смахивании - PullRequest
0 голосов
/ 05 октября 2018

Как реализовать, как показано на картинке ниже:

При движении вправо (влево)

enter image description here

При перемещении влево (в направлениисправа)

enter image description here)

Код:

Это код, который я пытался, но могне достичь того же, что и на изображении.Как оформить, как показано на изображении, с цветом фона и закругленными углами с текстом?

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

        View itemView = viewHolder.itemView;
        Paint p = new Paint();

        if (dX > 0) {          

            c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,
                    (float) itemView.getBottom(), p);

        } else {

            RectF rightButton = new RectF(itemView.getRight() , itemView.getTop(), itemView.getRight(), itemView.getBottom());
            p.setColor(Color.BLACK);
            c.drawRoundRect(rightButton, dX, dY, p);
            drawText(mContext.getString(R.string.cancel), c, rightButton, p);
        }

        // Fade out the view when it is swiped out of the parent
        final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
        viewHolder.itemView.setAlpha(alpha);
        viewHolder.itemView.setTranslationX(dX);

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

private void drawText(String text, Canvas c, RectF button, Paint p) {
    float textSize = 30;
    p.setColor(Color.WHITE);
    p.setAntiAlias(true);
    p.setTextSize(textSize);

    float textWidth = p.measureText(text);
    c.drawText(text, button.centerX() - (textWidth / 2), button.centerY() + (textSize / 2), p);
}

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Ваш прямоугольник не рисуется, потому что левый и правый для new Rect() совпадают с itemView.getRight(), попробуйте следующий код.измените значения для Rect, как вам требуется.

RectF rightButton = new RectF(itemView.getRight() - 200 , itemView.getTop(), itemView.getRight(), itemView.getBottom());
0 голосов
/ 06 октября 2018

вы можете сделать это следующим образом

изменить файл Grad yur следующим образом

compile 'ru.rambler.android:swipe-layout:1.0.15'

в своем адаптере добавить это

        holder.swipe_layout.setOnSwipeListener(new SwipeLayout.OnSwipeListener() {
            @Override
            public void onBeginSwipe(SwipeLayout swipeLayout, boolean moveToRight) {
                try {

                    if (lastSwipeLayout != holder.swipe_layout) {
                        lastSwipeLayout.animateReset();
                    }


                } catch (Exception e) {
                }

                lastSwipeLayout = holder.swipe_layout;

                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            holder.swipe_layout.animateReset();
                        } catch (Exception e) {
                        }
                    }
                }, 3000);
            }

            @Override
            public void onSwipeClampReached(SwipeLayout swipeLayout, boolean moveToRight) {

            }

            @Override
            public void onLeftStickyEdge(SwipeLayout swipeLayout, boolean moveToRight) {

            }

            @Override
            public void onRightStickyEdge(SwipeLayout swipeLayout, boolean moveToRight) {

            }
        });

и в элементе утилизатора xmlдобавить это

<ru.rambler.libs.swipe_layout.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/swipe_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

 <!--put your layout codes here-->

    </LinearLayout>

           <!--this is your hidden button behind the item-->

    <FrameLayout
        android:id="@+id/item_delete"
        android:layout_width="125dp"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        app:gravity="right"
        app:bring_to_clamp="150dp"
        app:clamp="self"
        app:sticky="100dp">


            <ImageView
                android:layout_width="56dp"
                android:layout_height="56dp"
                android:padding="8dp"
                android:tint="@color/white"
                android:layout_gravity="center"
                android:src="@mipmap/ic_delete"
                />

    </FrameLayout>


</ru.rambler.libs.swipe_layout.SwipeLayout>
0 голосов
/ 06 октября 2018

Вы можете добиться этого, установив ItemTouchHelper.SimpleCallback на Recyclerview.

. Вы можете посмотреть этот замечательный пример здесь:

https://www.androidhive.info/2017/09/android-recyclerview-swipe-delete-undo-using-itemtouchhelper/

...