8

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

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

ответ

-2

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

7

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

Например:

<LinearLayout 

       android:orientation="horizontal" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:animateLayoutChanges="true" 
       /> 
4

Это может быть сделано с Scenes and Transitions 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, которая в основном будет исчезать и изменять границы анимированного представления.


Update суммируют от разговора в комментариях

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

+0

Я хочу это, когда я добавляю так: for (int i = 0; i

+0

Место 'TransitionManager.beginDelayedTransition()' перед циклом 'for'. – azizbekian

+0

Я пытаюсь добавить my_transition.xml Я получил ** @ android: interpolator/fast_out_slow_in требует уровня API 21 (текущий минимум 15) ** на 'android: interpolator =" @ android: interpolator/fast_out_slow_in "' –

1

Попробуйте

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

Я хочу слайд вверх один за другим, но этот слайд все customeview вместе. Мой 'linearLayout.addView (customView);' add in loop –

+0

Вы можете добавить задержку, я обновил ответ. – Pehlaj

+0

Мы можем добиться этого, используя Handler правильно – Pehlaj