Подтвердить что ты не робот

Как отключить чертеж украшения элемента 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() (в случае, если бит имеет значение).

4b9b3361

Ответ 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, то ничего не делать