是否可以覆盖Android的LayoutAnimationController
,使我在View
内指定的某些子ViewGroup
能够生成动画?我的目标是根据Activity
的当前状态选择一组任意子视图,并在同一时间使用相同的动画为它们设置动画,然后在以后选择不同的任意子视图集并做同样的事情。我希望能够持续这样做,直到Activity
完成运行。
到目前为止,我已经查看并驳回了几个选项:
startAnimation(Animation)
特定的子视图
但是,并不是所有人都能得到保证
在完全相同的时间开始和结束,特别是如果数量
任意集中的视图都很大。LayoutAnimationController.getAnimationForView()
喜欢这将是最简单的方法,但方法是最终的,不能
被覆盖。我一直在摸不着头脑,并且认为我会给Stack Overflow一个机会。
答案 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);
}
}
}
我并不担心任何其他可能的动画相关方法,因为我只通过View
为LayoutAnimationController
设置动画。
答案 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()
方法,以防止标题与列表的其余部分一起动画。因此,您应该查看可能需要覆盖的其他动画方法。