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