Это может быть сделано с 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>
Мы получим этот результат:
Обратите внимание, что мы должны выполнить TransitionManager.beginDelayedTransition()
до того, как было выполнено какое-либо изменение в макете (т. до addView()
). Тогда структура позаботится обо всем остальном.
Существует также другая перегрузка TransitionManager.beginDelayedTransition(ViewGroup)
, где вам не нужно указывать, какой именно переход вы хотите применить, и система будет выполнять анимацию AutoTransition
, которая в основном будет исчезать и изменять границы анимированного представления.
Update суммируют от разговора в комментариях
фреймворка TransitionManager
доступен из API 19, и полностью поддерживается API 21 (по полностью сказать, что я имею в виду, например, Slide
переход доступен из API 21). Хотя есть support package available, но он не поддерживает все функции. Кроме того, вы можете перейти в библиотеку TransitionsEverywhere, которая поддерживает все до Android 4.0.
Я хочу это, когда я добавляю так: for (int i = 0; i
Место 'TransitionManager.beginDelayedTransition()' перед циклом 'for'. – azizbekian
Я пытаюсь добавить my_transition.xml Я получил ** @ android: interpolator/fast_out_slow_in требует уровня API 21 (текущий минимум 15) ** на 'android: interpolator =" @ android: interpolator/fast_out_slow_in "' –