添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

只用一个布局文件就能实现约束性布局过渡的动画化

0 人关注

我一直在使用constraintlayout动画,使用两个布局文件

private void animate() {
        ConstraintSet set1 = new ConstraintSet();
        set1.clone(root);
        ConstraintSet set2 = new ConstraintSet();
        set2.clone(this, R.layout.layout_file_2);
        TransitionManager.beginDelayedTransition(root, transition);
        set2.applyTo(root);

然而,在布局中,我只改变了两个约束。我决定尝试以编程的方式来做,并这样做,这很有效。

private void showHidden() {
        ConstraintLayout parentLayout = findViewById(R.id.root_constraint_layout);
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(parentLayout);
        constraintSet.connect(R.id.search_layout, ConstraintSet.TOP, R.id.toolbar_layout, ConstraintSet.BOTTOM);
        constraintSet.connect(R.id.search_layout, ConstraintSet.BOTTOM, R.id.root_constraint_layout, ConstraintSet.BOTTOM);
        constraintSet.applyTo(parentLayout);

然而,这不是动画。我试着像以前在第一个作品中那样做动画(这次只用了一个布局文件),结果是这样的

private void animate2() {
        ConstraintLayout parentLayout = findViewById(R.id.root_constraint_layout);
        ConstraintSet set1 = new ConstraintSet();
        set1.clone(parentLayout);
        ConstraintSet set2 = new ConstraintSet();
        set2.clone(parentLayout);
        set2.connect(R.id.search_layout, ConstraintSet.TOP, R.id.toolbar_layout, ConstraintSet.BOTTOM);
        set2.connect(R.id.search_layout, ConstraintSet.BOTTOM, R.id.root_constraint_layout, ConstraintSet.BOTTOM);
        Transition transition = new Slide(Gravity.END).setDuration(500);
        TransitionManager.beginDelayedTransition(parentLayout, transition);
        set2.applyTo(parentLayout);

这就像第二个例子一样,但没有显示任何动画,新的约束条件立即跳到位。有什么方法可以让我在不使用两个layoyuts的情况下让动画工作吗? 还是我做错了什么? 谢谢。

android
android-animation
android-constraintlayout
Joseph Sang
Joseph Sang
发布于 2021-03-19
1 个回答
Yatin Batra
Yatin Batra
发布于 2021-03-19
已采纳
0 人赞同

你没有清除你应用约束集的视图一侧的约束。 你可以用以下方法来解决这个问题

constraintSet.clear(view.Layout.id, ConstraintSet.LEFT) //You can change LEFT with whatever side you are choosing 

在使用连接功能连接布局侧之前 .

这里有完整的代码,可以以更好的方式获得它:-。

val constraintSet = ConstraintSet()
    constraintSet.clone(view.rootLayout)
    view.layout.animate().alpha(1f).duration = 700
    constraintSet.clear(view.layout.id, ConstraintSet.LEFT)
    constraintSet.connect(
        view.layout.id,
        ConstraintSet.RIGHT,
        ConstraintSet.PARENT_ID,
        ConstraintSet.RIGHT
    view.layout.animate().translationX(resources.getDimension(R.dimen.zeroDP))
    val transition: Transition = ChangeBounds()