RecyclerView Drag Highlight

Как изменить / убрать выделение перетаскивания элемента Я использую ItemTouchHelper и знаю, что нужно что-то делать с методом onChildDraw, но я не хочу переопределять все событие ACTION_STATE_DRAG, нужно только воздействовать на серую рамку, которая появляется при перетаскивании элементов

Что имею: серая рамка

Изменить: я заметил, что рамка не появляется на устройствах до Lollipop, поэтому, возможно, мне просто нужно настроить некоторые цвета акцента темы, но я не могу найти правильный селектор для него (пробовал colorControlActivation и colorControlHighlight)

3 ответа

Решение

Я решил свою проблему. Эта серая рамка была просто возвышением элемента, то есть простой тенью, которая указывает на перетаскивание (когда вы берете элемент для перетаскивания, он становится выше других, поэтому у него есть тень; я думал так и был прав). Итак, я установил viewHolder.itemView.setOutlineProvider(null); и избавился от этого. Полный код здесь:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNullOutlineProvider(View view) {
    view.setOutlineProvider(null);
}

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

    final View view = viewHolder.itemView;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        setNullOutlineProvider(view);

    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        // do some stuff here
    } else {
          super.onChildDraw(c, recyclerView, viewHolder, 
              dX, dY, actionState, isCurrentlyActive);
    }
}

Или лучше сделать это в своем адаптере

Затирать onChildDrawOver() вместо onChildDraw(), onChildDraw() для рисования фона, onChildDrawOver() для рисования переднего плана, попробуйте этот код:

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

    if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
        View itemView = viewHolder.itemView;
        c.save();
        c.clipRect(itemView.getLeft() + dX, itemView.getTop() + dY, itemView.getRight() + dX, itemView.getBottom() + dY);
        c.translate(itemView.getLeft() + dX, itemView.getTop() + dY);

        // draw the frame
        c.drawColor(0x88888888);

        c.restore();
    }
}

выделение было добавлено ItemTouchHelper.onChildDraw -> ItemTouchUIUtilImpl.onDraw
переопределить, это работает для меня

      //ItemTouchUIUtilImpl.onDraw
public void onDraw(Canvas c, RecyclerView recyclerView, View view, float dX, float dY,
        int actionState, boolean isCurrentlyActive) {
    if (Build.VERSION.SDK_INT >= 21) {
        if (isCurrentlyActive) {
            Object originalElevation = view.getTag(R.id.item_touch_helper_previous_elevation);
            if (originalElevation == null) {
                originalElevation = ViewCompat.getElevation(view);
                float newElevation = 1f + findMaxElevation(recyclerView, view);
                ViewCompat.setElevation(view, newElevation);
                view.setTag(R.id.item_touch_helper_previous_elevation, originalElevation);
            }
        }
    }

    view.setTranslationX(dX);
    view.setTranslationY(dY);
}


//subclass of ItemTouchHelper.Callback
override fun onChildDraw(
    c: Canvas,
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder,
    dX: Float,
    dY: Float,
    actionState: Int,
    isCurrentlyActive: Boolean
) {
    viewHolder.itemView.setTranslationX(dX)
    viewHolder.itemView.setTranslationY(dY)
}
Другие вопросы по тегам