RecyclerView ItemTouchHelper - пользовательский вид

Я пытаюсь создать пользовательский вид (или изображение) при прокрутке влево/вправо.

Я близок к тому, что он работает, но у меня проблемы с использованием пользовательского образа.

Эффект, который я собираюсь, похож на этот: RecyclerView ItemTouchHelper салфетки удаляют анимацию

Посмотрите, что происходит внизу. Это деформирует изображение, когда происходит салфетка:

введите описание изображения здесь

Ниже мой код выглядит следующим образом:

@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) {
            Drawable d = ContextCompat.getDrawable(getActivity(), R.drawable.test_check);
            d.setBounds(itemView.getLeft(), itemView.getTop(), (int) dX, itemView.getBottom());
            d.draw(c);

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

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

Как сохранить неподвижное изображение, продолжая рисовать цвет фона? Возможно ли использовать изображение Android вместо изображения? Аналогично этому: https://github.com/wdullaer/SwipeActionAdapter

Ответы

Ответ 1

Вы можете подготовить свой макет вида ресайклера, чтобы включить контрольный символ ImageView и, возможно, еще один пустой вид с цветом фона. Вы также должны перенести все содержимое в swipeable во вложенный макет. Назначьте ссылку на содержимое с возможностью прокрутки в своем держателе. Затем просто позвоните setTranslationX в свой swipeable-контент в onChildDraw, например:

((MyViewHolder) viewHolder).swipeableContent.setTranslationX(dX);

Обновление с исходным кодом Пример:

Макет элемента просмотра ресайклеров:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="@dimen/recycler_view_item_height"
    android:background="@color/transparent">

    <!-- background color view -->
    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/purple" />

    <!-- check symbol image view -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="@dimen/check_symbol_width"
        android:contentDescription="@null"
        android:src="@drawable/check_symbol" />

    <!-- swipeable content container -->
    <LinearLayout
        android:id="@+id/swipeable_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <!-- here goes your swipeable content -->
    </LinearLayout>

</RelativeLayout>

Просмотр класса владельца:

class MyViewHolder extends RecyclerView.ViewHolder {

    // Swipeable content container.
    LinearLayout swipeableContent;

    /*
     ... here goes other sub-views
    */

    public ExpenseViewHolder(final View itemView) {
        super(itemView);
        // bind swipeable content container view
        swipeableContent = (LinearLayout) itemView.findViewById(R.id.swipeable_content);

        /*
         ... bind other sub-views
        */
    }
}

Подкласс ItemTouchHelper.Callback:

class ItemTouchHelperCallback extends ItemTouchHelper.Callback {

    @Override
    public void onChildDraw(final Canvas c,
                            final RecyclerView recyclerView,
                            final RecyclerView.ViewHolder viewHolder,
                            final float dX,
                            final float dY,
                            final int actionState,
                            final boolean isCurrentlyActive) {
        if (viewHolder instanceof MyViewHolder) {
            // translate by swipe amount, 
            // the check symbol and the background will stay in place
            ((MyViewHolder) viewHolder).swipeableContent.setTranslationX(dX);
        }
    }

}

Ответ 2

Я не уверен, было ли у вас решение или нет, а также не уверен, видели ли вы эту библиотеку или нет.

Я попробовал Android-SwipeListView библиотеку для одного из моих проектов и SwipeMenuListView для другого проекта с аналогичными требованиями.

Оба отлично работают на своих местах. Вы должны попробовать и проверить, как он должен работать для вашего требования.

Сообщите мне, если вам нужна дополнительная помощь от меня.

Наслаждайтесь кодированием...:)

Ответ 3

Просто измените (int)dX в d.setBounds() на любой integer, который вы хотите.

например:

d.setBounds(itemView.getLeft(), itemView.getTop(), 50, itemView.getBottom());