LayoutAnimation Controller可以仅为特定视图设置动画

时间:2012-09-27 20:00:03

标签: android layout-animation

是否可以覆盖Android的LayoutAnimationController,使我在View内指定的某些子ViewGroup能够生成动画?我的目标是根据Activity的当前状态选择一组任意子视图,并在同一时间使用相同的动画为它们设置动画,然后在以后选择不同的任意子视图集并做同样的事情。我希望能够持续这样做,直到Activity完成运行。

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

  1. 调用startAnimation(Animation)特定的子视图 但是,并不是所有人都能得到保证 在完全相同的时间开始和结束,特别是如果数量 任意集中的视图都很大。
  2. 似乎覆盖了LayoutAnimationController.getAnimationForView() 喜欢这将是最简单的方法,但方法是最终的,不能 被覆盖。
  3. 我一直在摸不着头脑,并且认为我会给Stack Overflow一个机会。

3 个答案:

答案 0 :(得分: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);
        }
    }
}

我并不担心任何其他可能的动画相关方法,因为我只通过ViewLayoutAnimationController设置动画。

答案 1 :(得分: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()
}

答案 2 :(得分:0)

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