Android: LinearLayout addView Анимация - PullRequest
13 голосов
/ 03 декабря 2009

В настоящее время у меня есть работающая программа для Android, которая программно добавляет представления к LinearLayout. Мне бы хотелось, чтобы эти представления были анимированными, и я не могу найти хороших ресурсов, чтобы выяснить, как это сделать.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 4 ]

13 голосов
/ 10 июля 2014

Это очень старый вопрос, но все же интересный: вы можете использовать атрибут android:animateLayoutChanges="true"

Например:

<LinearLayout

                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
               />
8 голосов
/ 26 апреля 2017

Это можно сделать с помощью API сцен и переходов .

Framework дает нам три Transition типов из коробки: Fade, Slide и Explode, но вы также можете создать свой собственный тип перехода, расширяющий класс Visibility и переопределяющий соответствующие методы.

Итак, имея любое ViewGroup, мы можем сделать это:

viewGroup.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View v) {
        Transition t = null;
        if (i == 1) {
            t = new Fade();
        } else if (i == 2) {
            t = new Slide(Gravity.BOTTOM);
        } else if (i == 3) {
            t = TransitionInflater.from(v.getContext())
                                  .inflateTransition(R.transition.my_transition);
        }

        Button button = new Button(v.getContext());
        button.setText("My button " + i++);

        TransitionManager.beginDelayedTransition(customLayout, t);
        viewGroup.addView(button);
    }
});

Где my_transition.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
               android:duration="3000"
               android:interpolator="@android:interpolator/fast_out_slow_in">

    <fade/>
    <slide android:slideEdge="bottom"/>

</transitionSet>

Мы получим этот результат:

enter image description here

Обратите внимание, что мы должны выполнить TransitionManager.beginDelayedTransition() до того, как были внесены какие-либо изменения в раскладку (то есть до вызова addView()). Тогда об остальном позаботится каркас.

Существует также другая перегрузка TransitionManager.beginDelayedTransition(ViewGroup), где вам не нужно указывать, какой именно переход вы хотите применить, и система выполнит AutoTransition анимацию, которая в основном будут исчезать и изменять границы анимированного представления.


Обновление Подведение итогов разговора в комментариях

Framework TransitionManager доступен из API 19 и полностью поддерживается из API 21 (говоря полностью, я имею в виду, например, переход Slide доступен из API 21). Хотя существует пакет поддержки , но он не поддерживает всю функциональность. Кроме того, вы можете перейти к библиотеке TransitionsEverywhere , которая поддерживает все до Android 4.0.

4 голосов
/ 28 апреля 2017

Попробуйте

1. Добавить вид в линейный макет

linearLayout.addView(customView);

2. Добавить slide_up.xml в res/anim папку

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">

  <translate
    android:duration="500"
    android:fromYDelta="100%"
    android:toYDelta="0%" />
</set>

3. Применить анимацию сразу после добавления вида

Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up);
customView.startAnimation(animation);

Если вы хотите анимировать представления один за другим, используйте следующие строки

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            linearLayout.addView(customView);
            Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up);
           customView.startAnimation(animation);
        }
 }, 500);
0 голосов
/ 31 октября 2010

Вы можете использовать ViewFlipper и установить анимацию оттуда, вы можете взглянуть на этот учебник , Удачи.

...