在约束布局中创建视图并为其设置动画

时间:2019-05-17 10:26:04

标签: android kotlin android-animation

我想在约束布局中创建一个视图(即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,动画会起作用,但是如何一击即发?

1 个答案:

答案 0 :(得分:0)

我认为android如何计算布局问题。当您调用TextView(this)和layout.addView(txt2)时,视图已创建并添加到子级列表,但在屏幕上没有高度,宽度和位置。在UI的Looper中,将线程排队到布局textView的任务中,该布局调用onMeausure和txt2及其子级的布局。如果它排入了UI线程,则在您的函数完成后它将成为copmlite,并且在“布局” tx2之前开始动画。

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

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