我想使用ConstraintSet为活动制作动画,因为它在此视频中显示: https://www.youtube.com/watch?v=OHcfs6rStRo
问题是我不知道在哪个生命周期方法中放置代码以使转换对用户可见。
在onCreate我打电话:
setContentView(R.layout.layout_first_keyframe_detail);
topConstraintLayout = findViewById(R.id.top_constraint_layout);
constraintSet = new ConstraintSet();
constraintSet.clone(this, R.layout.layout_detail_top);
然后我想致电:
TransitionManager.beginDelayedTransition(topConstraintLayout);
constraintSet.applyTo(topConstraintLayout);
当活动已经可见时。不幸的是,我没有找到任何生命周期方法来做到这一点。
答案 0 :(得分:1)
如果您查看TransitionManager.beginDelayedTransiton()
的实现,您会发现它从以下检查开始:
if (!sPendingTransitions.contains(sceneRoot) && sceneRoot.isLaidOut())
查看isLaidOut()文档将使您理解,视图必须至少绘制一次,以便可以执行动画:
如果此视图自从以来至少经过一种布局,则返回true 它最后一次连接到窗口或从窗口分离。
但是,将动画启动包裹在一条消息中对我有用。因此,您应该尝试这样做:
myView.post{
TransitionManager.beginDelayedTransition(topConstraintLayout);
constraintSet.applyTo(topConstraintLayout);
}
答案 1 :(得分:0)
使用ConstraintLayout和ConstraintSet创建动画,您必须首先考虑必须有一个起始布局和一个结束布局
第1步:创建布局
根据需要创建起始布局和结束布局
- > 假设起始布局名称为(activity),结束布局名称为(activity_alt)
第2步:创建动画
现在MainActivity
内部onCreate
方法调用您的函数foo
private void foo() {
var set = false
val constraint1 = ConstraintSet()
constraint1.clone(root)
val constraint2 = ConstraintSet()
constraint2.clone(this, R.layout.activity_alt)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
TransitionManager.beginDelayedTransition(root)
val constraint = if(set) constraint1 else constraint2
constraint.applyTo(root)
set = !set
}
}