Android - анимация макета с помощью align-parent (Kotlin) - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно анимировать макет снизу вверх, когда пользователь нажимает на EditText внутри этого макета.Вот мой код для этого:

myEditText.setOnFocusChangeListener() { _, focused ->
    if (focused) {
        val animation = object: Animation() {
            override fun applyTransformation(interpolatedTime: Float, t: Transformation?) {
                val params = myLayout.getLayoutParams() as RelativeLayout.LayoutParams
                params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE)
                myLayout.setLayoutParams(params)
            }
        }
        animation.duration = 1000
        myEditText.startAnimation(animation)
    }
}

Когда я нажимаю на EditText, «myLayout» правильно переходит в верхнюю часть экрана.Тем не менее, две проблемы:

1) Нет анимации, она просто прыгает наверх.Я хочу, чтобы он «скользил» вверх.

2) Что еще более важно, представления, которые установлены как «ниже» и относительно myLayout, не идут вверх с этим.Я знаю, что они установлены правильно, так как, когда я добавляю верхнее выравнивание в XML, они подходят к нему.Но программно кажется, что они остаются внизу экрана, все еще скрыты.

Я попробовал другой подход, используя ObjectAnimator, вручную перемещая все виды вверх:

val anims = AnimatorSet();
val anim1 = ObjectAnimator.ofFloat(myLayout, View.TRANSLATION_Y, -1000f)
val anim2 = ObjectAnimator.ofFloat(layoutBelow, View.TRANSLATION_Y, -1000f)
val anim3 = ObjectAnimator.ofFloat(layoutBelowBelow, View.TRANSLATION_Y, -1000f)
anims.playTogether(anim1, anim2, anim3)
anims.start()

Выполнение, которое заставляет анимацию работать, но представления ниже "myLayout" по-прежнему невидимы!Мне любопытно, имеет ли значение, что они изначально за кадром (?)

Мысли о том, чего мне не хватает?Если есть лучший способ справиться с этим, я также открыт для разных подходов.

1 Ответ

1 голос
/ 27 июня 2019

Этот вид анимации можно выполнить с помощью Transition API, который теперь доступен в пакете androix.

Вот пример, где Button равно centerVertical в RelativeLayout. TextView выровнен, чтобы быть ниже Button. После нажатия кнопки я удаляю правило centerVertical и добавляю правило alignParentTop к Button. Все анимации можно сделать почти в одну строку.

import androidx.transition.AutoTransition;
import androidx.transition.TransitionManager;
....

@Override
protected void onCreate(Bundle savedInstanceState) {
    ....
    View button = findViewById(R.id.button);
    button.setOnClickListener(btn -> {
        animate(btn);
    });
}

private void animate(View button) {
    RelativeLayout parent = findViewById(R.id.relativeLayout);

    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) button.getLayoutParams();
    lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    lp.removeRule(RelativeLayout.CENTER_VERTICAL);

    AutoTransition transition = new AutoTransition();
    transition.setDuration(2000);
    TransitionManager.beginDelayedTransition(parent, transition);
    button.setLayoutParams(lp);
}

расположение:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button" />

    <TextView
        android:id="@+id/bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true"
        android:text="bottom text" />

</RelativeLayout>

Результат:

enter image description here

...