Windows animation scale что это

Обновлено: 04.07.2024

Название модификации
Автор модификации:
Версия Андроид:
Версия Miui:
Версия прошивки:
Используемый инструмент:

Последний раз редактировалось kisasanya 14 май 2019, 19:59, всего редактировалось 3 раза.

MIUI | Модификации и украшательства

MIUI | Модификации и украшательства

Все изменения производятся на основе прошивки MiuiPro. На стандартных прошивках/прошивках от других ромоделов или команд код может отличаться. Последний раз редактировалось BadDa3mon 03 июл 2019, 14:14, всего редактировалось 41 раз. Мои разработки & Канал обновлений в Telegram
Благодарность: Я. Деньги & БПС-Сбербанк : 5435 5310 3112 8638

Дополнительные таймеры для режима Без звука и не беспокоить
Автор модификации: Google
Версия Андроид: 9.0 Pie
Версия Miui: 10
Версия прошивки: 9.5.9
Используемый инструмент: jBART

в MiuiSystemUI\res\values\arrays.xml находим

MIUI | Модификации и украшательства

Кастомизация батареи
Автор модификации: BadDa3mon
Версия Андроид: 9.0
Версия Miui: 10
Версия прошивки: 9.3.28 (работает и на старших)
Используемый инструмент: Batch APKTool 3.7.6 & APKTool 2.4.0

Разбираем: MiuiSystemUI.apk

Переходим по пути: smali/com/android/systemui/BatteryMeterView.smali

Метод: .method public update()V

Метод: .method private updatePercentText()V

После: invoke-virtual , Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

Метод: .method private updateResources()V

После: iget-object v5 , p0, Lcom/android/systemui/BatteryMeterView;->mBatteryTextDigitView:Landroid/widget/TextView;

Добавляем: invoke-virtual , Lcom/android/systemui/BatteryMeterView;->setSizePercent(Landroid/widget/TextView;)V

Метод: .method public setDigitViewTextColor()V

После (найдет два): invoke-virtual < v3 , v1>, Landroid/widget/TextView;->setTextColor(I)V

Добавляем (после обоих): invoke-virtual , Lcom/android/systemui/BatteryMeterView;->setColorPercent(Landroid/widget/TextView;)V

Разбираем: Settings.apk

Переходим по пути: res/values/arrays.xml

Добавляем переключатели (res/xml/status_bar_settings.xml): <Preference android:title="Кастомизация батареи" android:key="customize_battery" android:fragment="com.android.settings.CustomizeBattery" />

Файлы из архива раскидать по путям (CustomizeBattery.zip)

Респектуем dark'у и unix3dgforce'y за нормальную покраску градиентом, помощь и уменьшение кода Последний раз редактировалось BadDa3mon 13 июн 2019, 21:23, всего редактировалось 7 раз. Мои разработки & Канал обновлений в Telegram
Благодарность: Я. Деньги & БПС-Сбербанк : 5435 5310 3112 8638 Дополнительные значения для анимации системы
Автор модификации: Google
Версия Андроид: 9.0 Pie
Версия Miui: 10
Версия прошивки: 9.5.9
Используемый инструмент: jBART

Дополнительные значения для таймера перехода в 2G в умной сети
Автор модификации: Google
Версия Андроид: 9.0 Pie
Версия Miui: 10
Версия прошивки: MiuiPro 9.5.9
Используемый инструмент: jBART

MIUI | Модификации и украшательства

Кастомизация панели громкости
Автор модификации: BadDa3mon
Версия Андроид: 9.0
Версия Miui: 10
Версия прошивки: 9.5.16 (работает и на старших)
Используемый инструмент: Batch APKTool 3.7.6 & APKTool 2.4.0

Разбираем: MiuiSystemUI.apk

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiRingerModeLayout.smali

Метод: .method private initialize()V

Метод: .method private setupCountDownProgress()V

В самом начале, после: iget-object v0, p0, Lcom/android/systemui/miui/volume/MiuiRingerModeLayout;->mCountDownProgress:Landroid/widget/ProgressBar;

Добавить: invoke-virtual , Lcom/android/systemui/miui/volume/MiuiRingerModeLayout;->setCountDownProgressColor()V

Метод: .method private updateExpandedStateH()V

После: .locals 2

Добавить: invoke-static , Lcom/android/systemui/miui/volume/MiuiRingerModeLayout;->access$999(Lcom/android/systemui/miui/volume/MiuiRingerModeLayout;)V

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiVolumeDialogImpl$1.smali

Метод: .method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V

Перед: return-void

Добавить: :goto_return

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiVolumeDialogImpl$VolumeSeekBarChangeListener

Метод: .method public onProgressChanged(Landroid/widget/SeekBar;IZ)V

Найти: invoke-static , Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;->access$5300(Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;)Landroid/content/res/ColorStateList;

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiVolumeDialogImpl.smali

Метод: .method private initColumn(Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl$VolumeColumn;IIIZZ)V

Метод: .method private initDialog()V

После: iput-object v0, p0, Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;->mMutedColorList:Landroid/content/res/ColorStateList;

Добавить: invoke-virtual , Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;->setMutedFieldColor()V

Перед: return-void

Добавить: invoke-virtual , Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;->setCustomBackgroundColor()V

Метод: .method private updateVolumeColumnSliderH(Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl$VolumeColumn;ZI)V

Найти: invoke-virtual , Landroid/widget/SeekBar;->setProgressTintList(Landroid/content/res/ColorStateList;)V

Заменить на: invoke-virtual , Lcom/android/systemui/miui/volume/MiuiVolumeDialogImpl;->setCustomSeekbarMutedColor(Landroid/content/res/ColorStateList;Landroid/widget/SeekBar;)V

Метод: .method public init(ILcom/android/systemui/plugins/VolumeDialog$Callback;)V

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiVolumeDialogView.smali

Добавить два метода:

Переходим по пути: smali/com/android/systemui/miui/volume/MiuiVolumeTimerDrawableHelper.smali

Метод: .method private addTextDrawables(Landroid/content/Context;)V

Метод: .method private updateDrawables()V

После: .locals 6

Разбираем: Settings.apk

Добавляем переключатели (res/xml/sound_settings.xml): <Preference android:title="Кастомизация панели звука" android:key="customize_volume_panel" android:fragment="com.android.settings.CustomizeVolumePanel" />

Файлы из архива раскидать по путям (CustomizeVolumePanel.zip):

Screenshot_2019-05-13-17-44-24-449_com.android.settings.jpg Screenshot_2019-05-13-17-44-32-175_com.android.settings.jpg Screenshot_2019-05-13-17-44-34-988_com.android.settings.jpg Последний раз редактировалось BadDa3mon 12 июн 2019, 10:37, всего редактировалось 7 раз. Мои разработки & Канал обновлений в Telegram
Благодарность: Я. Деньги & БПС-Сбербанк : 5435 5310 3112 8638

MIUI | Модификации и украшательства

Расположение счётчика уведомлений
Автор модификации: BadDa3mon
Версия Андроид: 9.0
Версия Miui: 10
Версия прошивки: 9.3.28 (работает и на старших)
Используемый инструмент: Batch APKTool 3.7.6 & APKTool 2.4.0

Разбираем: MiuiHome.apk

Переходим по пути: smali/com/miui/home/launcher/Launcher.smali

Метод: .method public createItemIcon(Landroid/view/ViewGroup;Lcom/miui/home/launcher/ItemInfo;)Lcom/miui/home/launcher/ItemIcon;

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

Удалите ненужные приложения

Этот совет кажется очевидным, но многие пользователи его почему-то постоянно игнорируют. Если вы боитесь потерять установленные ранее приложения, то не стоит переживать по данному поводу. Восстановить их можно будет в считанные секунды. Ваш Андроид – это не библиотека и не база данных. Храните на устройстве только самые полезные инструменты и игры, это позволит сэкономить место и увеличить его производительность. Удалив ненужные приложения, а особенно те из них, которые работают в фоновом режиме, вы не только освободите место, но и снимите нагрузку с процессора. В результате смартфон/планшет будет работать шустрее, а батарея начнет разряжаться не так быстро.

Вайп данных

Если Андроид начал очень сильно тупить, то в этой ситуации можно пойти на более радикальный шаг. Сделайв вайп (wipe data/factory resert), вы вернете девайс к тому состоянию, в котором он находился в момент покупки. Разделы data и cache будут очищены, все программы и папки сотрутся, при этом останутся картинки, видео и музыка. Предварительно лучше создать Nandroid бэкап, сделать резервные копии важных данных и сохранить их где-то на ПК или в облаке для дальнейшего восстановления.

Анимация и эффекты

Также вы можете отключить анимацию и эффекты, которых достаточно много во всем интерфейсе. В первую очередь это создаст визуальный эффект того, что система работает быстрее, ну и нагрузку немного снимет. Чтобы это сделать, необходимо открыть настройки, перейти к информации о телефоне и семь раз нажать на номер билда. Таким образом вы активируете опции разработчика, в которых и содержатся необходимые пункты: Window Animation Scale и Transition Animation Scale. Прежде чем отключить их, можете выставить значение каждого на 10, а потом сравнить скорость работы системы при нулевых и максимальных показателях.

Синхронизация и обновления

Конечно, обновлять приложения необходимо. Как правило, новые версии всегда оптимизированы для более быстрой работы, используют меньше ресурсов и содержат в себя разные интересные фичи. Что касается синхронизации, то иногда ее лучше отключить. Например, вы проверяете почту всего дважды в день, а значит, обновить ящик можно и вручную. Если же процесс будет происходить автоматически через каждые 15 минут, то это приведет к более высокому использованию ресурсов вашего Андроида.

Если вдруг версия операционной системы вашего Android смартфона или планшета – это KitKat, то в таком случае вы можете активировать ART (Android Run Time) – замену виртуально машины Dalvik. С Android Run Time приложения запускаются гораздо быстрее, правда, новая среда все еще находится на стадии разработки, и далеко не все приложения поддерживают это нововведение. Более детально о ART читайте тут.

Тег scale и соответствующий ему класс ScaleAnimation служат для анимации размеров объекта.

Пульсация

Используйте атрибуты scaleHeight и scaleWidth внутри тега <scale>, чтобы описать высоту и ширину относительно границ оригинального объекта Drawable. Используйте атрибут scaleGravity для изменения опорной точки масштабированного изображения.

Рассмотрим пример масштабирования. Создадим проект, в котором элемент ImageView будет пульсировать - постоянно увеличиваться и уменьшаться в размерах. В папке res/anim создадим два файла:

res/anim/enlarge.xml

res/anim/shrink.xml

Разместите в макете активности компонент ImageView и добавьте код:

Запускайте проект и любуйтесь эффектом.

Ваш браузер устарел. Видео не увидите

Упрощаем код

На самом деле мы написали очень много лишнего кода. Если посмотреть внимательно на созданные нами файлы анимации, то увидим, что они содержат одинаковые параметры, которые меняются в обратном порядке - размеры увеличиваются или уменьшаются. Для подобных случаев, когда используются одинаковые значения для анимации, предусмотрены атрибуты repeatMode и repeatCount. Первый атрибут позволяет сменить направление анимации, а второй - задаёт число анимаций (infinite для бесконечности или любое число больше нуля).

Упростим код предыдущего примера. Удалим файл shrink.xml. В файле enlarge.xml добавим пару новых атрибутов:

В коде нам уже не понадобятся слушатели анимаций и загрузка второго файла анимации. Код станет намного короче. Судите сами:

Атрибуты fillBefore, fillAfter и fillEnabled

Возможно, в некоторых примерах вам будут попадаться атрибуты анимации fillBefore, fillAfter fillEnabled или их программные аналоги - методы setFillAfter(), setFillBefore(), setFillEnabled().

С помощью данных атрибутов можно указать, когда следует проводить трансформацию. Так fillAfter показывает, что финальная трансформация происходит после окончания анимации, а fillBefore показывает, что начальная трансформация происходит до начала анимации.

Это может быть полезным в некоторых случаях. Как это работает, лучше смотреть на живых примерах.

Также применимо к набору анимаций:

Упругая кнопка

Ещё один пример создания эффекта упругой кнопки. Для этого к анимации следует добавить Interpolator.

Добавим в центр экрана кнопку.

В папке res/anim создадим файл bounce.xml для анимации кнопки - будем увеличивать её размер.

На этом этапе можно запустить простую анимацию по щелчку.

Не слишком эффектно. Добавим интерполятор. Создадим новый класс.

Добавим в анимацию.

Ваш браузер устарел. Видео не увидите

Класс ScaleAnimation

Класс ScaleAnimation наследуется от класса Animation и отвечает за анимацию изменения размеров.

Орёл или решка

Напишем пример анимации flip - переворачивания изображения на другую сторону.

Добавим на экран ImageView, который будет содержать одну из сторон монеты.

Напишем код переворачивания монетки:

Сжатие происходит с полного размера до 0 от краёв к центру. Расширение использует обратный процесс.

Запустив проект, мы можем наблюдать распространённый эффект вращения монеты (flip), когда видим обратную сторону. Для круглых изображений эффект выглядит достаточно приемлемо. Для прямоугольных изображений лучше использовать анимацию при помощи ObjectAnimator, который использует перспективу для более реалистичного эффекта.

Через XML

Чтобы воспроизвести этот же эффект через XML, создадим два файла в папке res/anim:

shrink.xml

grow.xml

Разметку оставим прежней, только напишем другой код:

На скриншоте представлены две стороны монеты. Если у вас есть такая монета, то свяжитесь со мной. Я хочу такую монету.


Привет, %username%! Сегодня я хотел бы поделиться с тобой способом без лишних усилий реализовать анимированное изменение размеров компонента в приложении для Android.

Я много читал про анимацию, а вот использовать в своих интерфейсах до сих пор не довелось. Хотелось опробовать наконец всякие Layout Transitions, Animators, Layout Animations и написать по этому поводу статейку, чтобы и самому лучше запомнить, и другим разжевать. Закончилось, однако, всё гораздо прозаичней — кастомным ViewGroup и ObjectAnimator'ом.

Итак, мне захотелось сделать разворачивающийся при получении фокуса EditText, как в Chrome для Android, вот такой:

Быстро прошерстив StackOverflow для определения примерного направления движения нашёл 2 варианта реализации:

  1. Использовать ScaleAnimation.
  2. Так или иначе пошагово менять размер EditText'а и запрашивать requestLayout() на каждом шаге.

Берём за основу второй способ и начинаем думать как уйти от вызова requestLayout() на каждом шаге. Но начнём, как положено, с малого.

Пишем ViewGroup

Начнём с того, что создадим кастомный ViewGroup для размещения наших компонентов:

Разметка содержит 3 элемента:

  1. Кнопка «Добавить таб», имеет фиксированный размер, находится слева.
  2. Кнопка «Выбрать таб», имеет фиксированный размер, находится справа.
  3. Поле для ввода URL (UrlBar, наследник от EditText'а), заполняет собой оставшееся свободное пространство.

Я делал всё это поверх другого примера, так что можно заметить присутствие лишнего кода. Например, кнопка «Добавить таб». Она отображается только при переключении в режим выбора таба, в нашем же случае она просто скрыта.

Добавляем аниматор

Сначала добавим параметр, который будет меняться во время анимации. Не будем напрямую изменять размер UrlBar'а из Animator'а, а введём переменную, которая будет отображать текущий прогресс анимации в процентах.


Мы собираемся использовать ObjectAnimator, так что нужно добавить getter и setter для нашего параметра, однако, если minSdkVersion >= 14, то, чтобы избежать рефлексии, лучше создать поле класса Property для этого.


Теперь добавим 2 inner-класса и 2 поля для старта анимации.


Не забудем зарегистрировать наш OnFocusChangeListener в initializeViews!

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

  1. При изменении фокуса мы создаём ObjectAnimator, который пошагово изменяет переменную, обозначающую процент получения фокуса полем.
  2. На каждом шаге вызывается invalidate() для ViewGroup. Данный метод не приводит к переразметке, он только перерисовывает компонент.
  1. Скрываем все остальные элементы чтобы они не мешали отрисовке анимации (в нашем случае это кнопка переключения табов).
  2. Вызываем requestLayout() чтобы после завершения анимации реальные границы UrlBar'а совпадали с наблюдаемыми (помните, что после вызова requestLayout() методы onMeasure+onLayout могут быть вызваны с задержкой!).
  3. Начинаем пошагово менять процент выполнения анимации, вызывая на каждом шаге invalidate().
  4. Вручную на каждом шаге высчитываем границы UrlBar'а для текущего процента и перерисовываем его.

Готовимся к рисованию

Чтобы посчитать размер UrlBar'а на каждом шаге нам нужно знать его начальный и конечный размер. Добавим 2 переменные, в которые будем запоминать этот размер и в очередной раз немного поменяем onLayout:

Рисуем!

Помните, непосредственно во время анимации реальный размер UrlBar'а не меняется, это происходит либо в начале, либо в конце анимации, а по-умолчанию отрисовывает он себя в соответствии с границами, полученными на этапе разметки. Таким образом, во время анимации реальный размер компонента больше наблюдаемого. Чтобы уменьшить в этой ситуации наблюдаемый размер при отрисовке UrlBar'а воспользуемся хитростью — будем делать clipRect на canvas'е.

Ещё одна хитрость заключается в том, чтобы убрать фон у UrlBar'а и отрисовывать его вручную.

Немножечко меняем разметку.


Вводим переменную для отрисовки фона.


И, наконец, отрисовка! Добавим в метод drawChild(Canvas, View, long) условие для UrlBar'а:


Всё готово, можно запускать и смотреть:

Заключение

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

Я же искренне надеюсь, что данный пример окажется для кого-то полезным. Удачи и да прибудет с вами плавная анимация!

Читайте также: