View visibility animation android

The Code City

Search This Blog

Animate View on Visibility (Visible — Gone) Changes Android Example

  • Get link
  • Facebook
  • Twitter
  • Pinterest
  • Email
  • Other Apps
Default Animations in Android

We are now done, findViewById refrences the root layout inside which you want to show animations. Now is the time you can build and show or hide some views and test if this works or not! It will work. So wasn’t that easy? Of course you can have you custom animation and not the default changeBounds and Fade animations, but for simple Visibility the default ones are the best in my opinion.
In case you want to show your custom animations, you need to create a LayoutTransition object and supply it to the layout using the setLayoutTransition() method but that the code for some other day!

Also, if you are not interested in XML, you can also apply the same animations when there are layout changes using the beginDelayedTransition method. This method was added in API level 19 so make sure the device satisfies the API level before you use this code:

Источник

Анимации c помощью Transitions API

На хабре ещё не была освещена тема Transitions API для анимаций, которые появились в Android начиная с 4.4 (KitKat) и продолжили свое развитие в 5.0 (Lollipop). В своей статье я расскажу о том, как упростить работу с анимациями с их использованием и как применять их на любом устройстве с версией Android 4.0 и выше.

Вместе с Android 4.4 был представлен новый механизм анимации изменений в layout. Ещё в версии 4.0 появился первый вариант решения этой проблемы — флаг animateLayoutChange для ViewGroup. Но даже с вызовом метода getLayoutTransition() и изменением его параметров он был недостаточно гибок и не давал полного контроля над тем, как будет анимироваться наше изменение (transition).

KitKat Transition API приносит нам понятия сцены — Scene и некоторого изменения между сценами — Transition. В добавок к ним вводим понятие Scene root для определения корневого layout, внутри которого будут происходить изменения сцен. А сама сцена это некоторый враппер над ViewGroup, который описывает конкретное состояние его самого и всех содержащихся в нем объектов View.

Теперь про сам Transition. Это механизм, отвечающий за считывание требуемых значений параметров у View, которые изменились при смене сцен и генерирующий анимации для плавного изменения этих состояний.

Начнем с самого простого варианта использования Transitions API.
Представим, что текущее состояние нашего layout это первая сцена. Допустим у нас просто изображен квадрат.
Опишем layout через xml:

Теперь мы просто хотим анимированно увеличить размер нашего квадрата. Чтобы уже начать привыкать к понятию сцен назовем это изменение переходом ко второй сцене.

Результат:

Неплохо, анимация всего одной строкой. Причем таких изменений внутри layout может быть любое количество.
Теперь попробуем настроить некоторые параметры анимации. Для этого нужно указать конкретный Transition, который мы будем выполнять. Метод beginDelayedTransition может принимать вторым параметром любого наследника класса Transition. Именно про них мы сейчас и поговорим.

Читайте также:  Телевизор томсон не загружается андроид

Простые типы Transition

Сцены

Вернемся к сценам. В первом примере мы разобрали самый простой способ использования API. Но сцены можно описывать и более формально, например, чтобы было удобнее между ними переключаться.

Опишем layout нашего Activity так, чтобы в нем была кнопка для смены сцен и FrameLayout, который будет нашим Scene root. Внутрь его сразу ставим layout, который является первой сценой, но вынесем его в отдельный файл.

Содержимое scene1. Поместим туда всё тот же квадрат, но в левый верхний угол:

И создадим файл scene2. Квадрат переместим в правый верхний угол и увеличим в размерах. Также, добавим TextView, которого не было в первой сцене.

В onCreate у Activity опишем:

Результат:

И о главном. Бэкпорт

Легко понять, почему этим API ещё мало кто пользуется и даже мало кто про него знает. Сейчас то время, когда разработчики только недавно осознали моральное право отказаться от поддержки Android 2.x и большинство новых проектов наконец начинаются с поддержкой minSdk Android 4.0. Но пока ещё мало смысла использовать API, которое будет работать только начиная с 4.4, ведь большинство девайсов ещё на более старых версиях.
Но! Transition API уже можно использовать для Android 4.0+ и везде анимация будет работать одинаково. Для этого я разрабатываю библиотеку, которую назвал Transitions Everywhere. Она является бэкпортом Transition API на более старые версии Android. Для интеграции в свой проект требуется подключить библиотеку как gradle зависимость:

И для всех классов, связанных с этим API, заменить импорт на пакет com.transitionseverywhere.* вместо android.transition.*

О библиотеке

Когда я начал интересоваться этой темой я нашел две похожие библиотеки:
github.com/guerwan/TransitionsBackport
github.com/pardom/TransitionSupportLibrary
Что их объединяет, так это то, что их создатели, видимо, забили на их развитие и обе они не реализовали до конца все, что можно было бы реализовать для обратной совместимости некоторых функциональностей на старых версиях Android. Я взял их за основу и добавил много нового. Различные исправления некоторых некорректных поведений, которые проявлялись, например на версиях до 4.3. К тому же, API моей библиотеки совместимо с версиями Android 2.2+, но на версиях до 4.0 смена сцен(layout) будет выполняться без анимации. Также, я стараюсь идти в ногу со временем. Не так давно выпустили новую версию Android 5.0 (Lollipop) и код всего пакета transitions API в ней, также, во многом изменился. Я смержил все изменения в свою библиотеку.

Что нового в API из 5.0

    Появилась возможность задавать TransitionName для View. Помечая одним и тем же именем View в первой и во второй сцене мы говорим, что переход именно между ними нужно анимировать. Это удобно, потому что раньше нам необходимо было для двух сцен, описанных в разных xml файлах указывать одинаковые id для таких View. В 5.0 transitionName можно указывать как атрибут в описании через xml, или вызывая метод setTransitionName у любого наследника View. В своей библиотеке я эту функциональность частично портировал таким образом: я предлагаю вызывать статический метод TransitionManager.setTransitionName(View v, String transitionName) вместо аналогичного у самого наследника View и отказаться от установки transitionName через xml.

Читайте также:  Лучшие весы для андроид

  • Slide. Новый Transition, который является наследником Visibility, как и Fade. C помощью него появляющаяся в сцене View может «прибегать» из выбранного края. Пример с new Slide(Gravity.LEFT)):
    • Explode. Во многом похож на Slide, но View будет выбегать или из некоторого направления, который задается с помощью так называемого эпицентра Transition(см. метод setEpicenterCallback) или же из случайного угла, если этот эпицентр не задан.
    • TransitionPropagation. Описывает задержку начала анимации. Например, при установке CircularPropagation чем View ближе к установленному эпицентру, тем раньше она начинает анимироваться. Задается для Transition через параметр setPropagation.
      Пример удаления всех View из FrameLayout с Explode Transition и установленным CircularPropagation(эпицентром ставится точка тапа на экран):

      ChangeImageTransform. Transition, который анимирует матричный переход изображения внутри ImageView. С помощью него можно плавно изменять размеры и scaleType изображений. Разберем на примере. Барышню слева мы подвергли операциям ChangeBounds и ChangeImageTransform, тогда как девушке справа достался только ChangeBounds. Невооруженным взглядом заметно как правая «дергается» в начале анимации:

    • ChangeClipBounds. Плавное изменение параметра clipBounds у View. Но! Так как метод setClipBounds появился только в Android 4.3, то и изменять этот параметр и его же анимировать мы сможем только начиная с этой версии. Пример:

    • Path (Curved) motion. Появилась возможность устанавливать для любого Transition правило расчета координат параметров, состоящих из двух координат с помощью метода setPathMotion. например, при изменении координат x и y, View может прибежать к новым координатам не по прямой, а по дуге. Чтобы показать пример того, как это выглядит просто приведу ссылку на неплохую статью об этом.

    • Немного о том, что ещё появилось нового, но что пока не удалось портировать.
      Activity Transition, хорошо разрекламированный гуглом в анонсах Lollipop и Material Design. Видимо, много логики спрятано в самих Activity, даже нужно устанавливать специальный флаг. Так что, напрямую это портировать не так просто. Та же ситуация и с Fragment Transition.
      Новый Transition под именем ChangeTransform — аналог ChangeImageTransform, но применяет матричное преобразование для любых View.

    Targets

    Задаем Transition через xml

    Сами Transition можно загружать из xml файла. Его кладем в папку res/anim. Пример

    Мы создали набор операций TransitionSet, состоящий из трех других Transition. Заодно применили тут ранее не рассмотренное свойство startDelay — время задержки перед началом выполнения анимации. Аналог для вызова из кода — Transition.setStartDelay(long startDelay).

    Можно загружать из xml файла целый TransitionManager, в котором описывать разные правила для смен сцен в зависимости от того, в каком порядке они происходят. Простой пример:

    Примечание
    Два рассмотренных выше примера подправлены для работы с моей библиотекой Transitions Everywhere. Если использовать системные Transition API, то сами xml файлы нужно класть в директорию res/transition и для всех атрибутов необходимо использовать namespace android: вместо app:

    Кастомные Transitions

    Чтобы ещё больше убедиться какая крутая штука эти Transitions, давайте напишем свой собственный Transition.
    Допустим, мы хотим анимировано изменять размер шрифта у TextView. (Как подсказал в комментариях bimeg, этот пример немного оторван от реальности, потому что не стоит анимировать свойства, каждое изменение которых во время анимации вызывает requestLayout())
    От нас требуется переопределить методы captureStartValues, captureEndValues и createAnimator. Первые два отвечают за снятие значений необходимых параметров View до и после смены сцен. А метод createAnimator, собственно, создает аниматор для этого изменения параметров.

    Результат:

    Источник

    Android добавление простых анимаций в то время как setvisibility(view.Ушедший)

    Я создал простой макет.Я закончил дизайн без анимации, но теперь я хочу добавить анимацию, когда textview нажмите событие, и я не знаю, как его использовать. Мой дизайн xml выглядит хорошо или нет? Любые предложения будут оценены.

    мой XML

    мой java

    5 ответов

    вы можете сделать две вещи, чтобы добавить анимацию, сначала вы можете позволить android анимировать изменения макета для вас. Таким образом, каждый раз, когда вы изменяете что-то в макете, например, изменение видимости вида или позиции просмотра, android автоматически создает анимацию затухания/перехода. Чтобы использовать этот набор

    на корневом узле в вашем макете.

    ваш второй вариант будет вручную добавлять анимации. Для этого я предлагаю вам использовать новый API анимации, представленный в Android 3.0 (Honeycomb). Я могу привести несколько примеров:

    это исчезает в View :

    это перемещение View вниз по высоте:

    возвращает View в исходное положение после перемещения в другое место:

    вы также можете использовать setDuration() установить продолжительность анимации. Например, это исчезает a View в течение 2 секунды:

    и вы можете комбинировать столько анимаций, сколько вам нравится, например, это исчезает View и перемещает его вниз, в то же время в течение 0,3 секунд:

    и вы также можете назначить слушателя анимации и реагировать на все виды событий. Например, когда начинается анимация, когда она заканчивается или повторяется и т. д. Используя абстрактный класс AnimatorListenerAdapter вам не нужно реализовывать все обратные вызовы AnimatorListener сразу, но только те, которые вам нужны. Это делает код более читаемым. Например, следующий код исчезает из View перемещает его вниз по высоте в течение 0,3 секунды (300 миллисекунд), и когда анимация сделана, ее видимость установлена в View.GONE .

    пожалуйста, проверьте этой ссылка. Что позволит анимации, как l2r, r2l, T2b, b2t анимации.

    этот код показывает анимацию слева направо

    Если вы хотите сделать это из R2L, используйте

    для сверху вниз, как

    основываясь на ответе @Xaver Kapeller, я придумал способ создания анимации прокрутки, когда на экране появляются новые виды (а также анимация, чтобы скрыть их).

    Он выходит из этого состояния:

      1 2 3 4
    • Последняя Кнопка

    Итак, когда пользователь нажимает на первую кнопку, элементы «кнопка 1», «кнопка 2», «Кнопка 3» и «кнопка 4» появятся с помощью анимации затухания, а элемент «последняя кнопка» будет двигаться вниз до конца. Высота макета также изменится, что позволит правильно использовать вид прокрутки.

    это код для отображения элементов с анимацией:

    и этот код, чтобы скрыть элементы анимации:

    Примечание есть простой хак на метод, чтобы скрыть анимацию. На прослушивателе анимации mHiddenLinearLayout мне пришлось удалить сам слушатель, используя:

    это потому, что как только прослушиватель анимации присоединен к представлению, в следующий раз, когда любая анимация будет выполнена в этом представлении, прослушиватель также будет выполнен. Это может быть ошибка в прослушивателе анимации.

    удачи в кодировании!

    обновление: для любого прослушивателя, подключенного к представлениям, он должен быть удален после завершения анимации. Это делается с помощью

    Источник

    Читайте также:  Как изменить настройки dns android
    Оцените статью