我有一些基本的项目装饰,这在ItemDecoration.onDrawOver
方法中绘制了一些东西。
此RecyclerView
上还设置了DefaultItemAnimator
。动画效果很好,一切都很好。除了一件事。
当用此适配器中设置的新项交换所有现有项时,将在动画运行时显示装饰。
我需要一个办法把它们藏起来。当动画结束时,它们需要显示,但在运行时,它们必须隐藏。
我尝试了以下几种方法:
public void onDrawOver(..., RecyclerView.State state) {
if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) {
return;
}
// else do drawing stuff here
}
但这并没有帮助。装饰只在动画的较短时间内被移除,但随后在它仍在运行时再次出现。
此外,setup还包括一个RecyclerView.Adapter
,它是hasStableIds() (如果该位很重要)。
发布于 2015-05-22 08:02:46
这可能在一定程度上取决于您正在使用的动画类型,但至少对于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);
}
}
(如果需要支持< API 11,您可能更喜欢使用ViewCompat.getTranslationY(child)
。)
注意:对于其他类型的动画,可能需要进行额外的调整。(例如,可能还需要考虑水平平移。)
发布于 2015-03-16 02:05:40
我自己找到了答案:
要在项目动画期间隐藏项目装饰,只需在onDraw/onDrawOver
中使用此签入
public void onDrawOver(..., RecyclerView parent, ...) {
if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) {
return;
}
// else do drawing stuff here
}
发布于 2019-09-27 16:28:51
您可以尝试检查子alpha (仅适用于默认动画)。如果alpha为0,则不执行任何操作
https://stackoverflow.com/questions/29061450
复制相似问题