Как отключить чертеж украшения элемента RecyclerView во время анимации элементов
У меня есть базовое украшение элемента, которое рисует какой-то материал в методе ItemDecoration.onDrawOver
.
Этот RecyclerView
также имеет на нем DefaultItemAnimator
.
Анимации работают, все отлично. Кроме одного.
Когда все существующие элементы заменяются новым элементом, установленным в этом адаптере, декорации отображаются во время анимации.
Мне нужен способ скрыть их.
Когда анимация заканчивается, они должны быть показаны, но пока они работают, они должны быть скрыты.
Я попробовал следующее:
public void onDrawOver(..., RecyclerView.State state) {
if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) {
return;
}
// else do drawing stuff here
}
но это не помогает. Украшение удаляется только в течение короткого периода анимации, но затем появляется снова, пока оно все еще работает.
Также настройка включает RecyclerView.Adapter
, которая hasStableIds() (в случае, если бит имеет значение).
Ответы
Ответ 1
Это может зависеть от типа используемой анимации, но, по крайней мере, для DefaultItemAnimator
вам нужно учитывать перевод X/Y, выполняемый во время анимации. Вы можете получить эти значения с помощью child.getTranslationX()
и child.getTranslationY()
.
Например, для вертикального случая onDraw/onDrawOver
:
private void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
final int dividerHeight = mDivider.getIntrinsicHeight();
for (int i = 1; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int ty = (int)(child.getTranslationY() + 0.5f);
final int top = child.getTop() - params.topMargin + ty;
final int bottom = top + dividerHeight;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
(Вы можете использовать ViewCompat.getTranslationY(child)
, если вам нужно поддерживать < API 11.)
Примечание. Для других типов анимаций могут потребоваться дополнительные настройки. (Например, также может потребоваться учет горизонтального перевода.)
Ответ 2
Нашел ответ сам:
Чтобы скрыть украшения предметов во время анимации элемента, вы можете просто использовать эту проверку в onDraw/onDrawOver
:
public void onDrawOver(..., RecyclerView parent, ...) {
if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) {
return;
}
// else do drawing stuff here
}
Ответ 3
Вы можете попробовать проверить дочернюю альфу (только для случая анимации по умолчанию). Если альфа 0, то ничего не делать