2016-07-13 4 views
0

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

что у меня есть: gray frame

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

+0

что серая рамка? – Harlan

ответ

1

я решил мою проблему. Эта серая рамка была просто возвышением элемента, т. Е. Простой тень, которая указывает на перетаскивание (когда вы поднимаете элемент для перетаскивания, он становится выше других, поэтому он имеет тень, я так думал и был прав). Поэтому я установил 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); 
    } 
} 

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

0

перезапись 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(); 
    } 
} 
+0

Как вы можете видеть на моем примере, рамка рисуется под представлением, поэтому мне не нужно использовать onChildDrawOver(). Когда я пробовал свой код, серый кадр все еще присутствует, но вид тонируется серым цветом от onChildDrawOver() – Hahaido

+0

Я до сих пор не могу понять, что представляет собой серый кадр на вашем рисунке. Вы имеете в виду тень под диалогом? или вы хотите сделать вид ярче – Harlan

+0

Мой пример представляет фактическое изображение, а не то, что я хочу достичь. Верхний диалог - это нормальное состояние, более низкий диалог - представление находится в состоянии перетаскивания. В левой части нижнего диалога вы видите небольшую часть серого штриха эллипса - это серый кадр, о котором я говорю, и я хочу избавиться от него – Hahaido