4

是否有可能以这样的方式覆盖 Android ,只有我在 a 中指定的LayoutAnimationController某些 child才会动画?我的目标是根据当前状态选择任意一组子视图,并在完全相同的时间使用相同的动画为它们设置动画,然后在稍后选择不同的任意子视图集并执行相同的操作. 我希望能够持续执行此操作,直到完成运行。ViewViewGroupActivityActivity

到目前为止,我已经查看并取消了几个选项:

  1. 单独调用startAnimation(Animation)特定的子视图,但不能保证它们将在完全相同的时间开始和结束,尤其是在任意集合中的视图数量很大的情况下。
  2. 覆盖LayoutAnimationController.getAnimationForView()似乎是最简单的方法,但该方法是最终的,不能被覆盖。

一段时间以来,我一直在为此挠头,并认为我会给 Stack Overflow 一个机会。

4

3 回答 3

7

我无法找到改变 Android 的方法LayoutAnimationController,但确实想出了一个简单的解决方案来满足我的需求。我创建了一个View子类,如果我愿意,它可以选择性地忽略运行动画的调用。

public class AnimationAverseView extends View {

    private boolean mIsAnimatable = true;

    public void setAnimatible(boolean isAnimatable) {
        if (!isAnimatable) {
            clearAnimation();
        }
        mIsAnimatable = isAnimatable;
    }

    @Override
    public void startAnimation(Animation animation) {
        if (mIsAnimatable) {
            super.startAnimation(animation);
        }
    }
}

我不担心任何其他可能的动画相关方法,因为我只View通过LayoutAnimationController.

于 2012-10-05T08:32:11.937 回答
1

我看到这个问题是在 7 年零 6 个月前提出的,但今天我自己也遇到了,创建自定义子视图对我来说似乎有点麻烦。

我发现使用自定义外部布局似乎可以解决问题,您必须重写 attachLayoutAnimationParameters。对于属于布局动画的每个子视图都会调用此方法,并且在 ViewGroup 中实际触发布局动画时调用此方法。它将 AnimationLayoutParams 附加到孩子,在这种情况下它是动画的。所以简单地说,如果你不给一个孩子附加任何 LayoutAnimation 参数,它就不会成为布局动画的一部分。

class CustomLayout @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private val excludeForLayoutAnimation by lazy {
        listOfNotNull(findViewById(R.id.text), findViewById(R.id.fab))
    }

    override fun attachLayoutAnimationParameters(
        child: View?,
        params: ViewGroup.LayoutParams?,
        index: Int,
        count: Int
    ) {
        if (child !in excludeForLayoutAnimation) {
            super.attachLayoutAnimationParameters(child, params, index, count)
        }
    }

}

如果您现在只是在外部自定义视图上调用它,它将排除您指定的子视图:

customView?.apply {
    layoutAnimation = AnimationUtils.loadLayoutAnimation(
        context,
        R.anim.layout_animation_fade_in
    )
    scheduleLayoutAnimation() // or maybe startLayoutAnimation()
}
于 2020-04-02T15:51:43.907 回答
0

我无法对已接受的答案添加评论,因此请在此处添加一些附加信息。happydude(2 月 17 日)的评论对我来说也是正确的。我有一个FrameLayout作为我的ListView标题的最外层视图,我需要重写该setAnimation()方法以防止标题与列表的其余部分一起动画。因此,您应该检查您可能需要覆盖哪些其他动画方法。

于 2015-11-03T03:55:13.753 回答