Создание и анимация представления в макете ограничений - PullRequest
0 голосов
/ 17 мая 2019

Я хочу создать представление (т. Е. 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 голосов
/ 17 мая 2019

Я думаю, проблема в том, как Android рассчитать макет.При вызове TextView (this) и layout.addView (txt2) представление создается и добавляется в список детей, но не имеет высоты, ширины и положения на экране.В Looper of UI thread будет поставлена ​​задача поставить в макет textView, который вызывает onMeausure и layout для txt2 и его дочерних элементов.Если он будет поставлен в очередь в потоке пользовательского интерфейса, он будет скопирован после завершения ваших функций, и вы запустите анимацию до того, как tx2 будет «выложен».

Я вижу 2 способа решить эту проблему.Во-первых: создайте txt2 в макете в начале действия или укажите его в xml, просто не создавайте для него ограничений и установите видимость GONE.ConstraintSet.applyTo правильно работает с появлением и исчезновением при изменении видимости.Второе: поставить запуск анимации отложенным.Не идеальное решение, но оно должно работать.

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