在约束布局中创建和动画视图

Create and animate view in constraint layout

我想在我的约束布局中创建一个视图(即 TextView)并在单击按钮时为其位置设置动画。

这是我的 onClick 的样子:

   fun onClick(view: View) {
        val layout = findViewById<ConstraintLayout>(R.id.layout)
        val txt2 = TextView(this)
        txt2.text = "Hello2"
        txt2.textSize = 70F
        txt2.id = View.generateViewId()
        tid = txt2.id
        layout.addView(txt2)
        val cs = ConstraintSet()
        cs.clone(layout)
        cs.connect(txt2.id, ConstraintSet.BOTTOM, textbox.id, ConstraintSet.TOP, 0)
        cs.connect(txt2.id, ConstraintSet.LEFT, layout.id, ConstraintSet.LEFT)
        cs.connect(txt2.id, ConstraintSet.RIGHT, layout.id, ConstraintSet.RIGHT)
        cs.applyTo(layout)

        startAnimation(txt2.id)
    }

    fun startAnimation(txt: Int) {
        val layout = findViewById<ConstraintLayout>(R.id.layout)
        TransitionManager.beginDelayedTransition(layout)
        val cs2 = ConstraintSet()
        cs2.clone(layout)
        cs2.connect(txt, ConstraintSet.TOP, layout.id, ConstraintSet.TOP, 50)
        cs2.applyTo(layout)
    }

如果我在实际点击之前在某处创建 TextView,则动画有效,但如何一次性完成?

我认为 android 计算布局的方式存在问题。当您调用 TextView(this) 和 layout.addView(txt2) 视图创建并添加到子列表时,但在屏幕上没有高度、宽度和位置。在 UI 线程的 Looper 中,将排入布局 textView 的任务,即调用 onMeausure 并为 txt2 及其子级进行布局。如果它在 UI 线程中排队,它将在您的函数完成后成为 copmlite,并且您在 tx2 "layouted".

之前开始动画

我看到有 2 种方法可以解决这个问题。首先:在 activity 开始的布局中创建 txt2 或在 xml 中指定它,只是不为其创建约束并将可见性设置为 GONE。 ConstraintSet.applyTo 在更改可见性时正确显示和消失。第二:延迟动画的开始。不是完美的解决方案,但它应该有效。

Handler().postDelayed({
  startAnimation(txt2.id)
}, 100)