在约束布局中创建和动画视图
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)
我想在我的约束布局中创建一个视图(即 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)