gpt4 book ai didi

android - 如何在项目动画期间禁用 RecyclerView 项目装饰绘图

转载 作者:IT老高 更新时间:2023-10-28 23:10:51 26 4
gpt4 key购买 nike

我有一些基本的元素装饰,可以在 ItemDecoration.onDrawOver 方法中绘制一些东西。

这个RecyclerView 也设置了DefaultItemAnimator。动画正在运行,一切都很好。除了一件事。

当所有现有项目都与此适配器中的新项目交换时,在动画运行时会显示装饰。

我需要一种方法来隐藏它们。当动画结束时,它们需要显示,但在运行时,它们必须隐藏。

我尝试了以下方法:

public void onDrawOver(..., RecyclerView.State state) {
if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) {
return;
}
// else do drawing stuff here
}

但这没有帮助。装饰仅在动画的短时间被移除,但在它仍在运行时会再次出现。

还包括一个 RecyclerView.Adapter ,它具有StableIds()(以防该位重要)。

最佳答案

这可能在某种程度上取决于您使用的动画类型,但至少对于 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)。)

注意:对于其他类型的动画,可能需要进行额外的调整。 (例如,可能还需要考虑水平平移。)

关于android - 如何在项目动画期间禁用 RecyclerView 项目装饰绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com