Анимация в андроид

Анимация в андроид

Android 24.10.2017 | 5

Даже бюджетные современные смартфоны на базе операционной системы Android работают достаточно шустро, но что делать миллионам людей, которые купили себе телефон несколько лет назад, когда еще не было мощных недорогих процессоров? Как правило, многие обладатели мобильных устройств на Android жалуются на лаги и медленную скорость работы систему, однако скрытая настройка, которая есть во всех версия операционной системы от Google, позволяет ощутимо повысить производительность всего смартфона.

Операционная система Android просто напичкана различными анимациями и красивыми переходами, на отрисовку которых процессор тратит значительную часть ресурсов, а вместе с тем и энергию батареи. К счастью, скрытая настройках во всех Android-смартфонах ощутимо повышает скорость работы путем отключения системных анимаций. После этого интерфейс станет значительно более отзывчивым, а мобильное устройство начнет работать ощутимо быстрее.

Для этого необходимо запустить приложение «Настройки» и перейти в раздел «Батарея и производительность». В самом низу должен отображаться раздел «Системные анимации», который и требуется открыть. Здесь следует выбрать вариант «Не показывать системные анимации», после чего потребуется обязательная перезагрузка смартфона для вступления изменений в силу. Если такой настройки нет, то отчаиваться не стоит, поскольку в некоторых мобильных устройствах на Android, в зависимости от прошивки, она может быть хорошо спрятана от посторонних глаз.

Чтобы отключить анимации необходимо открыть раздел «О телефоне» в настройках и семь раз нажать на раздел «Номер сборки», после чего появится сообщение вида «Вы стали разработчиком». Теперь следует вновь вернуться на главную страницу настроек и открыть раздел «Для разработчиков». Здесь в подразделе «Рисование» должно быть три настройки – «Анимация переходов», «Длительность анимации» и «Анимация окон». Каждую из них необходимо перевести в состояние «Без анимации», после чего желательно перезагрузить Android-смартфон.

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

Присоединяйтесь к нам в Google News, Twitter, Facebook, ВКонтакте, YouTube и RSS чтобы быть в курсе последних новостей из мира технологий будущего.

Начиная с Android 4.4 в арсенале разработчиков появился дополнительный инструмент для создания анимаций — Transitions Framework. Изначально он предназначался для создания анимаций изменения состояния приложения путём манипулирования несколькими View. С выходом Android 5.0 набор доступных для использования анимаций был расширен, чтобы соответствовать представленной тогда же концепции Material Design.
Transitions Framework позволяет быстро и безболезненно создавать различные анимации. Поэтому в процессе работы над iFunny было невозможно пройти мимо этого инструментария. Вниманию читателей предлагается частный случай использования Transitions API — создание анимации перехода между Activity с эффектом «бесшовности».

С визуальной точки зрения представленные в Transitions Framework анимации переходов между Activity можно условно разделить на два типа: обычные анимации и анимации с общим элементом. Концепт анимации с общим элементом продемонстрирован на честно украденном с сайта developer.android.com рис. 1. На нём в роли общих элементов выступают аватар и имя контакта.
Рис. 1. Анимация перехода между Activity с общими элементами
Но никто не любит длинные вступления, поэтому сразу перейдём к рассказу о том, как создавались анимации данного типа в приложении iFunny. В качестве первого примера рассмотрим анимацию, показанную на рис. 2. Для её использования нам потребуется Android версии 5.0 и выше.
Рис. 2. Анимация перехода между Activity на экране аутентификации пользователя
С точки зрения пользователя, здесь нет ничего необычного: один экран, простенькая анимация. Но, как вы уже могли догадаться, «под капотом» — переход между двумя экранами с одним общим элементом.
Первым шагом к созданию подобного перехода является, как ни странно, выбор этого самого элемента и определение его местоположения в вёрстке обеих Activity. После этого в описание каждого View, отображающего выбранный элемент, нужно добавить атрибут android:transitionName, а также назначить им android:id, если таковой отсутствует.
В нашем случае это обычные ImageView следующего вида:
<ImageView android:layout_width=»40dp» android:layout_height=»40dp» android:layout_gravity=»center» android:transitionName=»@string/email_auth_transition» app:srcCompat=»@drawable/ic_ifunny_logo» />
Здесь стоит отметить два важных момента. Во-первых, в обоих ImageView необходимо установить одинаковые transitionName, что логично. Во-вторых, коль скоро мы используем ImageView, то и содержимое у них должно быть одним и тем же, поскольку использование двух отличающихся ресурсов может привести к неожиданным последствиям (как минимум к морганию анимируемого View в начале и конце анимации).
На втором шаге необходимо добавить опции для запускаемой (второй) Activity, сообщающие о том, что при её запуске должна быть запущена анимация.
Примечание. Под «второй» подразумевается запускаемая Activity, переход к которой должен быть осуществлён, а под «первой» — запускающая Activity.
Делается это следующим образом:
Bundle bundle = null; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { View v = activity.findViewById(R.id.auth_logo); if (v != null) { ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, v, activity.getString(R.string.email_auth_transition)); bundle = options.toBundle(); } } Intent intent = new Intent(activity, SecondActivity.class); if (bundle == null) { activity.startActivity(intent); } else { activity.startActivity(intent, bundle); }
В приведённом листинге:

  • R.id.auth_logo — ImageView из первой Activity, используемый в анимации;
  • activity — первая Activity;
  • R.string.email_auth_transition — метка, ранее оставленная в вёрстке обоих ImageView;
  • SecondActivity.class — вторая Activity.

И сейчас внимательный читатель может испытать недоумение: во вступлении речь шла об использовании API level 19, в примере фигурировал API level 21, а в листинге выше стоит ограничение на API level 22. К сожалению, при написании кода выяснилось, что анимации перехода с общим элементом могут вести себя некорректно на телефонах c API level 21. Проявляется это в виде подтормаживаний анимации в целом и артефактов на анимируемом View в частности. Если вы уже знакомы с темой, знаете причины подобного поведения и/или способы решения описанной проблемы — расскажите нам об этом в комментариях.
На третьем шаге необходимо описать анимацию перехода, т.е. указать путь, проходимый анимируемым View, и трансформацию самого View. Для этого создадим отдельный файл projectName/src/main/res/transitions/email_auth_transition.xml со следующим содержимым:
<?xml version=»1.0″ encoding=»utf-8″?> <transitionSet xmlns:android=»http://schemas.android.com/apk/res/android» android:transitionOrdering=»together»> <changeBounds/> <changeImageTransform/> </transitionSet>
Немного теории. Тег transitionSet предназначен для описания сразу нескольких трансформаций, применяемых к анимируемому View. Параметр transitionOrdering отвечает за порядок применения этих трансформаций. В нашем случае они применяются одновременно. Существует несколько типов готовых трансформаций, представленных в Transitions Framework. С полным списком можно ознакомиться на этой странице. Мы же остановимся на двух конкретных: changeBounds и changeImageTransform.
Первая предназначена для трансформации размера View. Вторая работает только с ImageView и в связке с первой позволяет изменять не только размер, но и форму ImageView. Использовав данные трансформации, получаем на выходе анимацию изменения размера изображения, представленную на рис. 2. Если не указывать тип движения анимируемого View, то он будет двигаться по кратчайшему пути. Более интересный способ передвижения рассмотрим во втором примере.
Последним шагом создания анимации является её объявление в темах обеих Activity. Для этого отредактируем описание тем следующим образом (или создадим новые в папке projectName/src/main/res/values-v22/theme.xml):
<style name=»Theme.FirstActivity» parent=»Theme.AppCompat.Light.NoActionBar»> <item name=»android:windowActivityTransitions»>true</item> </style> <style name=»Theme.SecondActivity» parent=»Theme.AppCompat.Light.NoActionBar»> <item name=»android:windowActivityTransitions»>true</item> <item name=»android:windowSharedElementEnterTransition»> @transition/email_auth_transition </item> <item name=»android:windowSharedElementExitTransition»> @transition/email_auth_transition </item> </style>
Здесь:

  • android:windowActivityTransitions разрешает выполнение анимации перехода;
  • android:windowSharedElementEnterTransition указывает на файл с описанием анимации перехода от первой Activity ко второй;
  • android:windowSharedElementExitTransition указывает на файл с описанием анимации перехода при возвращении из второй Activity в первую.

Следует отметить, что для версий ОС ниже 5.1 необходимо создать темы с идентичными стилями, чтобы избежать вполне ожидаемых последствий в виде падения приложения. Например, поместим их в файл projectName/src/main/res/values/theme.xml:
<style name=»Theme.FirstActivity» parent=»Theme.NoActionBar.Translucent»/> <style name=»Theme.SecondActivity» parent=»Theme.TransparentActionBar»/>
Итак, для создания анимации перехода от Activity к Activity необходимо:

  1. Описать анимации (в нашем случае в xml-файле);
  2. Добавить эти анимации в xml-описание темы Activity;
  3. Пометить анимируемый общий элемент (View) в разметке;
  4. При запуске второй Activity указать в параметрах запуска, что для неё необходимо задействовать анимацию перехода.

Как видите, создавать такие анимации совсем не трудно, если не считать некоторых ограничений, упомянутых в первом примере. Теперь рассмотрим второй, более сложный пример. Тут нас интересует переход из раздела комментариев к профилю пользователя (рис. 3).
Рис. 3. Анимация перехода из комментариев к профилю пользователя
Все шаги по созданию перехода, рассмотренные выше, также подходят для этой анимации. А вот трансформация общего элемента реализована немного иначе. В приведённом ниже листинге описано перемещение общего элемента «по дуге» вместе с изменением его размера.
<transitionSet xmlns:android=»http://schemas.android.com/apk/res/android»> <changeBounds> <arcMotion android:maximumAngle=»90″ android:minimumHorizontalAngle=»90″ android:minimumVerticalAngle=»0″ /> </changeBounds> </transitionSet>
В чём же сложность второго примера? В первом случае использовалось изображение из ресурсов самого приложения, а тут — картинка загружается из сети. К тому же для комментариев изображение аватара пользователя берётся в более низком разрешении, чем для профиля. Поэтому требуется не только дать второй Activity доступ к изображению, используемому в первой, но и по завершении анимации подгрузить требуемое изображение в более высоком качестве. Так и получается две проблемы.
Для решения первой можно было бы собственноручно закэшировать изображение на диск или же передать его адрес в параметре второй Activity. Однако решение данной проблемы переложили на используемую в приложении библиотеку для загрузки изображений — Glide. При загрузке изображения достаточно просто добавить параметр diskCacheStrategy(DiskCacheStrategy.SOURCE), и оно будет закэшировано самой библиотекой (актуально для Glide версии 3.x). Следовательно, при повторном обращении к данному ресурсу из второй Activity будет использоваться кэшированный файл, что поможет нам избежать моргания анимируемого ImageView.
Вторая проблема также решается достаточно просто. В то время как осуществляется анимация перехода, профиль пользователя вместе с аватаром в более высоком разрешении скачиваются из сети и ожидают её завершения. Как только выполняются оба условия (завершение анимации и завершение загрузки), аватар пользователя обновляется. Добиться такого поведения можно, если использовать специальный Listener, в котором реализованы колбэки, вызываемые при смене статуса анимации. Для этого во Fragment, который принадлежит второй Activity, зададим этот самый Listener:

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { getActivity().getWindow().getSharedElementEnterTransition() .addListener(mEnterTransitionListener); } setAvatar(); }
Здесь происходит следующее:

  1. С помощью getSharedElementEnterTransition().addListener() задаётся Listener для анимации появления Activity;
  2. В методе setAvatar() производится попытка загрузки и установки аватара (который уже лежит в кэше).

Рассмотрим, как именно реализован Listener:
private Transition.TransitionListener mEnterTransitionListener = new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { } @Override public void onTransitionEnd(Transition transition) { onProfileUpdated(); } @Override public void onTransitionCancel(Transition transition) { } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } };
В методе onProfileUpdated() мы обновляем содержимое профиля, в т.ч. и аватар.
Стоит отдельно упомянуть случай, когда общий элемент уходит за пределы экрана. Особенность его состоит в том, что, вопреки (а может, и согласно) логике, анимация перехода всё равно будет выполнена и будет смотреться достаточно забавно (рис. 4).
Рис. 4. Анимация возвращения из профиля в комментарии
Чтобы избежать подобного поведения, достаточно в момент ухода общего элемента за пределы экрана выставить ему видимость, отличную от View.VISIBLE.
В целом можно сказать, что Transitions Framework является простым и мощным инструментом для создания анимаций. Он не ограничивается только анимациями перехода между Activity — в статье был рассмотрен лишь частный случай его использования. Также стоит отметить, что помимо предоставляемых трансформаций имеется возможность создавать свои собственные, но это уже совсем другая история, достойная отдельного поста.
P.S. А о том, как придумывались анимации для iFunny, вы можете прочитать .

Правда, что отключение анимации может ускорить старый смартфон?

Со временем старые смартфоны начинают работать медленнее — приложения обновляются, улучшаются и начинают потреблять больше ресурсов. В отличие от компьютеров, на мобильном устройстве нельзя увеличить количество оперативной памяти или заменить графический процессор. Несмотря на это, есть способы, которые помогут увеличить быстродействие системы. Одно из возможных решений проблем с производительностью — отключение анимации.

Как отключение анимации влияет на быстродействие системы?

Анимация на операционной системе Android позволяет плавно отображать переход между окнами программ. С включенной анимацией переход из одного раздела в другой выглядит более плавно — благодаря этому создаются красивые визуальные эффекты.

Нужно понимать, что анимация потребляет системные ресурсы смартфона (особенно заметно на бюджетных телефонах). В частности, основная нагрузка приходится на процессор мобильного устройства. Чтобы немного его разгрузить, можно попробовать отключить анимацию интерфейса. Так ЦП не будет тратить ресурсы и время на прорисовку эффектов при переходе из одного раздела в другой, а также при сворачивании окон приложений.

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

Как отключить анимацию на Android?

  1. Чтобы отключить анимацию, перейдите в настройки смартфона. Далее откройте раздел «Для разработчиков» (вот инструкция).
  2. Здесь находятся функции «Масштаб анимации окна», «Масштаб анимации перехода» и «Шкала длительности анимации».
  3. По умолчанию во всех трех разделах анимация включена. Попробуйте ее отключить и понаблюдайте за работой телефона.

Итоги

Отключение анимации не всегда помогает увеличить производительность системы. Причиной медленной работы гаджета могут стать технические проблемы: неисправность процессора или чипа памяти. Отключение эффектов анимации поможет увеличить быстродействие на программном уровне: это немного снизит нагрузку с ЦП, и система будет потреблять меньше ресурсов.

У вас есть частота обновления (60 кадров в секунду) от скорости анимации. Лучшим решением, на мой взгляд, является привязка скорости анимации к часам реального времени. В SDL вы можете сделать это с помощью функции SDL_Ticks(), которую вы можете использовать для измерения времени в миллисекундах.

В качестве примера рассмотрим этот пример (не рабочий код, просто эскиз):

void init() { animationRate = 12; animationLength = 13; startTime = SDL_Ticks(); } void drawSprite() { int frameToDraw = ((SDL_Ticks() — startTime) * animationRate / 1000) % animationLength; SDL_BlitSurface( hero, &clip, destination, &offset ); }

Если не ясно, переменная frameToDraw вычисляется путем вычисления времени, прошедшего с момента начала воспроизведения анимации. Вы умножаете это на скорость анимации, и вы получаете количество абсолютных кадров при скорости анимации. Затем вы применяете оператор modulo для уменьшения этого числа до диапазона длины анимации, и это дает вам рамку, которую вам нужно рисовать в это время.

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

Надеюсь, это поможет.

Ранее на устройствах Android версии 4,2 и 4,4, для изменении анимации окон, приходилось устанавливать различные программы и перед этим получать root права. Прогресс не стоит на одном месте, смартфоны постоянно улучшаются и получают свои обновления. Эти самые обновления делают наше устройство лучше и не заставляют своего пользователя пренебрегать к сторонним и лишним действиям и программам.

Советуем прочитать эти статьи:

Включение детского режима на устройстве Android

Установка игр и приложений с неизвестного источника

Установка звукового пакета в навигацию

Давайте приступим к настройке. По умолчанию в системе android, анимация окон и детальность переходов установлена на значение равное 1x. Её можно уменьшать и увеличивать уменьшение начинается от 0,5x а увеличение скорости до 10x. Так же есть возможность полного отключения «Без Анимации”Для того, чтобы настроить анимацию под себя, вы должны перейти в меню вашего устройства и найти настройки. В настройках устройства, пролистайте ниже до пункта «Для Разработчиков”. Перейдите в него, спуститесь ниже до раздела графика или рисования, вы там найдёте анимация окон и все, что связанное с анимацией.

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

Хотел предупредить сразу, при тестировании на устройстве google nexus, я установил анимацию на значение равное 0,5 и мой смартфон начал быстро разряжаться, после этого я поставил его на зарядку от сети. Простояв на зарядке около 3 часов, процент заряда поднялся всего на 5%, я подумал что случился глюк, но поставив его на ночь и смог зарядить всего на 30% которых мне не хватило и 15 минут. Долго думал в чем же все таки дело, хотел сбросить настройки предварительно сделав резервную копию и сбросил все стало работать как прежде, но когда начал восстанавливать данные и нужные настройки, все началось по прежнему.

Я решил отключить все что я сделал с анимацией и все встало на свои места. Так что сделайте собственные выводы и решите для себя, стоит ли это делать или нет.

На этом все, спасибо за внимание.

Автор материала: Александр Макаренков.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *