Ленинский Букварь - видео - все видео
Новые видео из канала RuTube на сегодня - 18 April 2026 г.
Новые видео из канала RuTube на сегодня - 18 April 2026 г.
00:00 Начало работы над оформлением страницы настроек • Обсуждение оставшихся задач по оформлению страницы настроек. • Проблемы с заполнением полей со списком и текстовых полей. • Решение уменьшить размер шрифта на кнопках обычного размера. 01:03 Исправление проблем с темами Windows • Проблема с автоматическим выбором темы Windows Light при запуске приложения. • Необходимость исправления отображения текста при наведении курсора в тёмной теме. • Возвращение переднего плана на прежнее значение для устранения проблемы. 01:59 Создание классов для заголовков • Создание трёх классов для заголовков: h, подразделы один и два. • Настройка размера, веса и цвета шрифта для заголовков. • Удаление полей и отступов для улучшения внешнего вида. 03:02 Настройка шрифтов и отступов для подзаголовков • Изменение размера шрифта для подзаголовков. • Увеличение отступов на верхней части для более плотного расположения элементов. • Создание градиента оповещения для улучшения внешнего вида. 04:35 Применение стилей к подкаталогам • Повторное использование стиля подзаголовка для всех подкаталогов. • Создание нового стиля для окна со списком с добавлением полей. • Настройка цвета «успех» и градиента для кнопок. 06:35 Настройка градиентов и цветов • Создание градиента успеха с зелёным цветом. • Настройка предупреждающего градиента с красным цветом. • Компиляция изменений для проверки результатов. 09:01 Настройка интервалов между кнопками • Добавление интервала между кнопками для улучшения визуального восприятия. • Ручная настройка отступов для устранения лишних пространств. • Проверка и корректировка интервалов между элементами. 11:05 Оформление полей списка • Создание нового стиля для полей списка. • Установка фона и рамки для полей списка. • Настройка толщины границы и переднего плана для улучшения внешнего вида. 12:13 Стилизация элементов списка • Добавление эффектов наведения курсора и выбора. • Стилизация выбранного элемента: передний план остаётся прежним, фон выделяется при наведении курсора. • Использование хэштега для подчёркивания презентатора контента. 14:30 Работа с текстовым полем • Создание текстового поля с границами, как у кнопок. • Настройка толщины границы и кисти border brush. • Исправление эффекта зависания текста. 15:15 Анализ шаблона текстового поля • Изучение содержимого шаблона текстового поля. • Настройка прозрачности фона по умолчанию. • Добавление текста в текстовое поле для тестирования. 16:34 Работа с водяными знаками • Добавление водяного знака с именем пользователя. • Проблемы с плавающим водяным знаком при удалении текста. • Решение проблемы путём добавления текста сверху. 18:06 Настройка стиля текстового поля • Определение строк и столбцов для текста. • Изменение цвета текста на белый. • Настройка стиля при наведении курсора и фокусировке. 21:15 Завершение настройки текстового поля • Проверка стиля в тёмном и светлом режимах. • Исправление цвета при фокусировке. • Подготовка к работе с полями со списком. 22:14 Создание поля со списком • Создание базового стиля для поля со списком. • Добавление подкладки и кисти для окантовки. • Привязка поля со списком к источнику элемента. 24:43 Финальные настройки • Исправление заголовка настроек. • Коррекция порядка градиентов для стильного вида. • Завершение работы над пользовательским интерфейсом.00:00 Исправление кнопок меню • Добавили класс `subtle` для кнопок меню, чтобы придать им сдержанный стиль. • Страница настроек стала выглядеть лучше. 00:47 Работа с галочками • Убрали обычную кнопку, чтобы сосредоточиться на галочках. • Добавили несколько галочек для предварительного просмотра. 01:45 Создание сетки и панелей • Создали сетку с двумя столбцами и панель стека. • Добавили флажок и удалили стандартный стиль флажка. 02:30 Анализ структуры флажка • Изучили структуру флажка на GitHub, используя шаблон Avalonia Fluent. • Выделили рамку, прямоугольник и элемент content presenter. 04:24 Проблемы со стилизацией • Попытались изменить стиль рамки, но столкнулись с ошибками. • Обнаружили, что свойства не переопределяются должным образом. 06:22 Переопределение шаблона • Создали шаблонный элемент управления `checkbox` и удалили его. • Переопределили тему элемента управления, чтобы управлять стилем флажков. 08:15 Визуализация стилей флажков • Визуально отобразили стили для разных состояний флажков: не отмечен, отмечен, промежуточное состояние, отключён. • Добавили отключённое состояние для каждой кнопки. 10:13 Упрощение стиля флажков • Удалили рамку вокруг флажка, чтобы упростить элемент. • Привязали текст к фоновому цвету, чтобы текст был одинаковым для отмеченных и неотмеченных элементов. 11:00 Завершение работы со стилями • Привели в порядок текст, удалив ненужные стили. • Обеспечили, чтобы текст был одинаковым независимо от состояния флажка. 12:00 Настройка стилей управления • Удаление стилей переднего плана и промежуточного уровня. • Оставление стилей для content presenter без изменений. • Исключение стилей для отключённого состояния презентатора контента. 13:12 Работа с контуром галочки • Изменение кисти для границы галочки для добавления цвета. • Настройка толщины контура и градиента фона. • Коррекция сетки для идеального совпадения с пикселями. 15:05 Настройка радиуса скругления и привязки шаблона • Установка радиуса скругления углов на 7 пикселей. • Замена динамических ресурсов на привязку к шаблону. • Решение проблемы с ошибкой при привязке шаблона. 17:20 Добавление значка и центрирование • Добавление значка из библиотеки иконок Phosphor. • Центрирование значка по вертикали и горизонтали. • Настройка выравнивания текста над иконкой. 18:57 Стилизация иконки и настройка прозрачности • Стилизация иконки галочки для заполнения блока. • Настройка прозрачности иконки по умолчанию. • Создание эффекта вырезания элемента управления. 20:54 Стилизация состояний элемента управления • Создание состояния без галочки и состояния при наведении. • Настройка цвета обводки и переднего плана при наведении. • Планирование работы над состоянием «отмечено» в будущем. 21:54 Создание состояния «отмечено» • Добавление градиентного фона для состояния «отмечено». • Подбор цвета рамки под цвет фона. • Завершение настройки значка и других элементов для состояния «отмечено». 22:51 Настройка флажка и наведения • Изменение прозрачности флажка для создания метки. • Добавление наведения, но цвет слишком голубой, требуется синий. • Проверка работы стилей по умолчанию. 23:45 Проблемы с наведением • Обнаружение бага: невозможность навести курсор на область между кнопкой и центром. • Решение проблемы путём добавления фона. 25:36 Промежуточное состояние • Определение промежуточного состояния между «выбрано» и «не выбрано». • Замена галочки на метку для выделения текста. • Настройка цвета и контура для промежуточного состояния. 26:33 Стилизация неопределённого состояния • Использование значка «бриллиант» для неопределённого состояния. • Настройка непрозрачности и цвета контура. • Упрощение стилей при наведении. 29:17 Отступы и область клика • Задание отступов для области клика. • Проверка работы эффектов при наведении. 30:52 Стилизация состояний при нажатии • Стилизация состояний при удержании флажка. • Изменение фона и непрозрачности границы. • Настройка глифа и контура в активном состоянии. 33:41 Завершение стилизации • Проверка переходов между состояниями. • Коррекция цветов при щелчке. • Уточнение стилей для перехода между состояниями. 35:35 Настройка состояний переключателя • Определение двух состояний: неопределённого и отмеченного. • Использование глифа для задания неопределённого состояния. • Добавление двоеточия для обозначения отмеченного состояния. 36:05 Проблемы с переходами между состояниями • Трудности с переходом из отмеченного в неопределённое состояние. • Решение игнорировать промежуточное состояние и добавить новый стиль. 37:02 Настройка порядка состояний 38:22 Проблемы с отображением неопределённого состояния 41:15 Стилизация трёх состояний 43:36 Настройка неактивного состояния 45:54 Завершение работы над переключателем 46:49 Планы на будущее00:00 Настройка пользовательской кнопки и шрифта • Создана пользовательская кнопка со значком. • Планируется стилизация страницы настроек по скриншоту. • Удаляется экологичный шрифт, используется шрифт Nunito. • Шрифты добавляются в ресурсы проекта. 01:02 Настройка стилей и выравнивание • В настройках стилей по умолчанию используется шрифт Nunito. • Исправляется вертикальное выравнивание кнопки со значком. • Компиляция проекта для обновления стилей. 02:22 Удаление ненужных стилей • Удаляются стили с использованием шрифта Echo. • Обновляются кнопки со значками. • Перенос стилей в ACOS для упрощения работы. 03:54 Стилизация заголовков • Создаётся класс для заголовков. • Настраиваются отступы, полужирный шрифт и размер шрифта. • Класс добавляется ко всем заголовкам. 06:05 Проблемы с заполнением сетки • Сетка не поддерживает заполнение, что создаёт проблемы со стилями. • Попытки использования CSS-стилей ограничены. • Решение: добавление дополнительных строк и столбцов в сетку. 07:30 Добавление отступов в сетку • Создаются дополнительные столбцы для добавления отступов. • Элементы перемещаются в новые столбцы. • Отступы добавляются сверху и снизу. 09:12 Стилизация кнопок • Разрабатываются стили для различных типов кнопок. • Кнопка меню изменяется на «незаметную». • Настраиваются анимации и эффекты наведения курсора. 11:37 Завершение работы со стилями • Разделение стилей на две части для удобства работы. • Проверка и корректировка стилей. 11:52 Настройка стилей кнопок • Изменение основного фона и переднего плана для каждой кнопки. • Добавление градиента для фона. • Использование чистых цветов: голубого, зелёного, синего и пурпурного. 13:18 Настройка шрифта и контура • Установка размера шрифта: средний или жирный. • Создание кнопки «Контур» с прозрачным фоном. • Настройка толщины границы контура около трёх сантиметров. 15:08 Работа с эффектами наведения курсора • Добавление отступов вокруг кнопок. • Настройка градиента фона для кнопки оповещения. • Улучшение эффектов наведения курсора, устранение мерцания. 17:07 Коррекция прозрачности контура • Изменение прозрачности контура на основной фон для устранения проблем с наведением курсора. • Копирование кисти-рамки для сохранения эффекта. • Изменение цвета текста на чёрный. 22:17 Настройка стилей для разных режимов • Применение разных стилей для кнопок в зависимости от их типа. • Увеличение толщины кисти для кнопок с контуром. • Сохранение эффекта выделения при наведении курсора на цветных кнопках. 25:15 Создание уменьшенных кнопок • Уменьшение размера кнопок и их контуров. • Настройка параметров шрифта и отступов для маленьких кнопок. • Проверка внешнего вида уменьшенных кнопок. 26:38 Завершение работы над стилями • Отправка изменений в исходный код. • Планы по оформлению флажков, выпадающих списков и заголовков.00:00 Введение в оформление пользовательского интерфейса • Обсуждение оформления пользовательского интерфейса на странице настроек. • Цель — сделать стандартную кнопку со значком. • Необходимость добавления XAML для отображения значка, содержимого и текста значка. 00:26 Проблемы с текущим подходом • Описание сложности работы с панелью стека и ярлыками. • Упоминание о необходимости учёта уникальности контента. • Идея использования ярлыка внутри кнопки для доступа к боковому меню. 01:03 Создание пользовательских элементов управления • Создание папки для пользовательских элементов управления. • Создание шаблона кнопки со значком. • Проблемы с переопределением стиля и потерей текста. 02:09 Переопределение стиля кнопки • Попытка переопределить стиль кнопки для исправления внешнего вида. • Потеря индивидуального стиля при переопределении. • Невозможность дальнейшего настройки стиля. 03:22 Использование шаблонов по умолчанию • Замена шаблона кнопки на шаблон по умолчанию из Avalonia. • Копирование шаблона кнопки и его переопределение. • Добавление пространства имён и префикса для доступа к кнопкам. 04:55 Стилизация всех кнопок • Применение стандартного стиля кнопок. • Изменение селектора для стилизации всех кнопок. • Достижение единого стиля для всех кнопок. 06:00 Клонирование шаблона кнопки • Создание идентичного клона шаблона кнопки. • Возможность изменения содержимого кнопки. • Объяснение необходимости стилизации под content presenter. 06:59 Удаление префикса XML • Предложение избавиться от префикса XML для определения кнопок. • Использование определения пространства имён XML. • Улучшение внешнего вида кнопки после удаления префикса. 08:14 Добавление стилизованного свойства • Добавление стилизованного свойства для текста значка. • Вставка значков в кнопку. • Настройка содержимого кнопки через content presenter. 10:15 Привязка контента • Привязка контента к кнопке. • Использование шаблона данных для контента. • Компиляция и проверка результата. 10:51 Работа с шаблонами контента и значками • Создан набор шаблонов контента вместо самого контента. • Добавлен значок и свойство стиля icontext для кнопки icon. • Привязка в стиле CSS упрощает работу с иконками. 11:27 Проверка работы на главном экране • Иконка привязана к тексту значка. • Изменение значений иконки приводит к её исчезновению и появлению. • Проверка работы на главном экране. 12:05 Настройка содержимого кнопки • Содержимое кнопки должно исчезнуть, но иконка сохраняется. • Настройка текста значка для упрощения интерфейса. 12:39 Добавление словаря ресурсов • Создание словаря ресурсов для управления иконками. • Объединение словарей ресурсов и их включение в приложение. 13:12 Очистка XAML-кода • Замена кнопок на кнопки со значками для упрощения кода. • Удаление ненужных элементов для очистки интерфейса. 14:30 Исправление ошибок выравнивания шрифта • Временное размещение содержимого на кнопках до исправления ошибки выравнивания шрифта. • Изменение семейства шрифтов кнопок после исправления ошибки. 15:38 Привязка ярлыков к боковому меню • Привязка ярлыков к боковому меню для сохранения функции расширения и сворачивания. • Решение проблемы с привязкой объекта label к основной модели просмотра. 16:26 Исправление контекста данных • Изменение контекста данных для корректной привязки. • Восстановление работы значков после исправления контекста данных. 16:55 Финальная проверка и завершение • Повторная проверка работы меню после исправления контекста данных. • Восстановление всех значков и текста на них. • Завершение работы над меню.00:00 Введение и исправление ошибки • Добавлены внедрение зависимостей и заводской шаблон для загрузки страниц. • Смоделирован пользовательский интерфейс для страницы настроек в Affinity. • Цель — превратить модель в реальный код и интерфейс с помощью Avalonia, сосредоточившись на структуре, а не на стиле. • Исправлена ошибка с viewmodel времени разработки, требующей фабрику страниц. 00:53 Создание конструктора для разработки • Создан конструктор для установки текущей страницы на новую. • Конструктор прокомментирован как работающий только во время разработки. • Добавлены основной цвет фона и текста для визуального контроля. 01:53 Структура страницы • Основная область страницы разделена на несколько частей. • Верхний уровень представлен сеткой с двумя столбцами и двумя строками. • Сетка содержит заголовок и содержимое, разделённое на две части. 02:54 Работа над заголовком • Заголовок состоит из сетки с фоном и панелью с тремя текстами. • Фон экспортирован в формате SVG и добавлен в ресурсы. • Изображение привязано к источнику и растянуто на всю длину. 03:56 Настройка изображения • Изображение растянуто на всю ширину с сохранением пропорций. • Настроена высота изображения и режим растягивания. 05:58 Панель стека с надписями • Внутри заголовка создана панель стека с тремя надписями «Настройки». • Надписи выровнены по горизонтали по центру. 06:52 Основной контент • Основной контент разделён на две колонки. • Создана панель стека с заголовком для общих данных. • Настроены отступы и поля для элементов. 09:31 Добавление кнопки • Добавлена кнопка с текстом «Лицензия на выпуск» и символом блокировки. • Кнопка будет стилизована отдельно. • Явно определены строки для избежания путаницы. 10:28 Настройка размера окна • Кнопка занимает больше места, чем текст, из-за маленького окна. • Устанавливаем минимальный размер окна на 1240 пикселей для большинства мониторов. • Пропорционально увеличиваем высоту окна. 11:22 Минимальный размер и макет • Устанавливаем минимальный размер, чтобы избежать прокрутки страницы вниз. • Сосредотачиваемся на макете, игнорируя стилистику. • Рассчитываем ширину проекта: 1400 пикселей, учитывая боковое меню и отступы. 12:20 Создание общего раздела • Создаём текстовый блок с переносом текста wrap. • Устанавливаем сетку без отступов, которые добавим позже с помощью стилей. • Игнорируем текущее оформление, сосредотачиваясь на макете. 15:09 Локации и панель стека • Начинаем с метки и сетки для локаций. • Добавляем текстовый блок и кнопку с плюсом. • Визуализируем сетку с помощью линий. 17:50 Управление элементами • Создаём элемент управления элементами для списка. • Привязываем элемент управления к viewmodel. • Исправляем привязку данных для автоматического выбора элементов. 21:30 Правая сторона интерфейса • Создаём панель с ярлыком, текстовым полем и полем со списком. • Копируем настройки левой стороны на правую. • Добавляем панель управления стеком для хоста SolidWorks. 22:39 Текстовый блок и перенос текста • Установка значения wrap для переноса текста в текстовом блоке. • Использование двоеточия в XML для добавления пробелов, но это не идеально. • Добавление специального элемента для переноса строки для более удобного управления пробелами. 23:46 Поле со списком • Поле со списком будет работать с привязкой данных и сервиса, а не с IP-адресами. • Хосты пакетного процесса будут транслировать свои IP-адреса для обнаружения. • Раздел PDM Enterprise будет представлять собой панель со стеками. 24:27 Панель управления стеком • Горизонтальная панель стека с тремя элементами: кнопка «не вводить текст» или «комбинировать», поле со списком и два текстовых поля. • Интервалы должны соответствовать стилю, который будет применяться. 25:33 Сетка и кнопки • Создание сетки с определением столбцов из трёх чётных величин. • Две кнопки: «войти в систему» и «обновить хранилище», расположенные горизонтально. 27:09 Кэш настроек • Кэш настроек аналогичен PDM Enterprise: панель в виде стека с текстом и тремя элементами-кнопками. • Копирование настроек PDM Enterprise и сохранение их в кэше. • Добавление кнопок для очистки кэша, экспорта и импорта кэша. 30:07 Стилизация и выравнивание • Важность единообразия отступов и интервалов между элементами. • Применение визуальных стилей для улучшения внешнего вида интерфейса. • Использование сеток для элементов, занимающих всю ширину или высоту, и стековых панелей для элементов, складывающихся в стопку.00:00 Начало создания приложения • Проверка основ приложения перед переходом к полноценному проекту. • Создание пользовательского интерфейса с поддержкой MVVM. • Планирование добавления внедрения зависимостей для разделения классов и повышения гибкости. 00:56 Добавление внедрения зависимостей • Установка пакета Microsoft Dependency Injection. • Перенос модели основного представления в внедрение зависимостей. 01:37 Концепция внедрения зависимостей • Объяснение важности указания всех зависимостей в одном месте. • Преимущества упрощения модульного тестирования и замены частей приложения. 02:14 Работа с коллекцией сервисов • Добавление одноэлементного объекта в коллекцию сервисов. • Создание поставщика услуг для предоставления сервисов. 03:07 Получение сервисов через внедрение зависимостей • Использование методов getService и getRequiredService для получения сервисов. • Проверка работы основной модели представления после внедрения зависимостей. 04:09 Внедрение дополнительных сервисов • Внедрение модели просмотра домашней страницы в качестве синглтона. • Разделение обязанностей между классами для повышения гибкости приложения. 05:44 Удаление ответственности из основной модели представления • Удаление создания страниц из основной модели представления. • Внедрение моделей просмотра страниц через внедрение зависимостей. 08:22 Проблемы с внедрением зависимостей • Обсуждение проблемы использования анти-шаблонов при внедрении поставщика услуг. • Необходимость создания временных объектов для оптимизации использования памяти. 09:24 Решение проблемы с временными объектами • Создание временных объектов при каждом вызове сервиса. • Избегание постоянного хранения экземпляров моделей просмотра. 10:15 Определение страниц другим способом • Перечисление страниц для оптимизации использования памяти. • Создание моделей просмотра только при необходимости. 10:45 Создание каталога и класса • Создаём новый каталог data. • Внутри каталога добавляем класс application page names в виде перечисления. • Перечисление представляет собой список с целыми числами и текстовыми значениями. 11:09 Модель просмотра страниц • Текущая страница представлена viewmodel, которая не хранит информацию о странице. • Добавляем класс page viewmodel, наследующий от base viewmodel. • В page viewmodel добавляем свойство page name для связи с названием страницы. 12:27 Настройка моделей просмотра • Изменяем все viewmodel на page viewmodel. • Создаём конструкторы для каждой страницы, задавая название страницы. • Проверяем название страницы в главной модели просмотра. 13:57 Генерация новых страниц • Обсуждается необходимость генерации viewmodel при переходе на страницу. • Рассматривается использование поставщика услуг для генерации моделей просмотра. • Подчёркивается проблема статического использования поставщика услуг. 16:09 Фабричный шаблон • Внедряем фабричный шаблон для генерации моделей просмотра страниц. • Создаём папку factories и класс factory pages. • Фабрика страниц создаёт модели просмотра на основе названия страницы. 18:17 Реализация фабрики страниц • Внедряем фабрику страниц в модель основного представления. • Привязываемся к функции, которая генерирует модели просмотра при вызове. • Функция получает доступ к поставщику услуг для генерации моделей. 20:44 Создание новых экземпляров • Используем переключатель для создания новых экземпляров моделей просмотра. • Каждый раз при вызове службы генерируется новый экземпляр модели. • Удаляем старые экземпляры при изменении страниц. 21:19 Перехват по умолчанию • Добавляем функцию перехвата по умолчанию для новых страниц. • Функция перехвата удаляет старые модели при появлении новых страниц. • Обеспечиваем доступ к зависимости для вызова функции генерации моделей. 22:23 Внедрение зависимостей в конструкторе • В конструкторе используется внедрение зависимостей через коллекцию. • Создаётся функция-фабрика PageViewModelFactory, которая возвращает PageViewModel. • Фабрика сохраняется как частная функция, доступная только для чтения. 22:56 Работа с фабрикой страниц • Фабрика страниц представлена как функция-делегат, которую можно вызывать через invoke. • При вызове invoke выполняется метод, который создаёт PageViewModel на основе имени страницы. 24:11 Упрощение кода с помощью нового синтаксиса C# • В новом синтаксисе C# упрощается передача свойств в конструктор. • Создаётся закрытый элемент factory для фабрики страниц. • Функция getPageView используется для получения PageViewModel по имени страницы. 26:57 Преимущества внедрения зависимостей • Внедрение зависимостей усложняет работу, но обеспечивает чистоту классов. • Модель основного представления чётко определена и легко тестируется. • Фабрика страниц должна знать имена всех страниц приложения. 27:54 Анализ работы кода с точками останова 29:47 Принципы внедрения зависимостей 30:45 Заключение и планы на будущее00:00 Введение и цели видео • В предыдущем видео было реализовано боковое меню и анимации. • Теперь нужно добавить страницы для навигации по приложению. • При нажатии на кнопку «Домой» должна загружаться домашняя страница, а при нажатии на другие страницы — соответствующие страницы. • Настройки можно сделать в виде всплывающего окна или переместить в главное окно. 00:44 Реализация навигации по страницам • Тема видео — реализация навигации по страницам. • Начало с изучения шаблона идентификатора в MVVM. • Шаблон идентификатора позволяет указывать моделям данных, какой вид должен загружаться. 01:18 Принцип работы шаблона идентификатора • Match проверяет, соответствует ли модель данных типу viewmodel. • Если совпадение найдено, вызывается метод build, который возвращает элемент управления. • Это позволяет привязывать элементы управления контентом и другие элементы пользовательского интерфейса. 03:33 Создание папок и видов • Создание папки «Просмотры» и перетаскивание в неё основного вида. • Создание пользовательского элемента управления Avalonia для домашней страницы. • Создание второй страницы — страницы процесса. 04:14 Настройка сетки и проверка работы • Размещение видов в сетке на главном экране. • Исправление ошибок с ресурсами и изображениями. • Временное добавление стилей для демонстрации работы страницы. 05:44 Динамическая привязка к viewmodel • Переход от привязки к конкретному виду к привязке к viewmodel. • Создание базы моделей приватного просмотра и концепции текущей страницы. • Привязка к observable свойству текущей страницы. 07:18 Реализация моделей просмотра страниц • Создание модели просмотра домашней страницы и страницы процесса. • Использование view locator для преобразования моделей просмотра в реальные виды. • Временное использование свойств для доказательства работы привязки. 08:43 Настройка конструктора и отладка • Установка текущей страницы по умолчанию в конструкторе. • Привязка содержимого к текущей странице. • Отладка с помощью точек останова для проверки работы привязки. 10:12 Добавление шаблонов данных приложения • Добавление шаблонов данных приложения и локатора просмотра. • Проверка соответствия данных модели просмотра. • Возвращение нового вида домашней страницы при успешной привязке. 11:30 Статический вид домашней страницы • Компиляция возвращает домашнюю страницу, но она статична. • Изменение страницы на страницу процесса не меняет результат. • Необходимо вернуть определённый тип на основе viewmodel. 12:00 Проверка viewmodel и поиск представления • Проверка, содержит ли название viewmodel. • Поиск представления с тем же именем, но с «view» вместо «viewmodel». • Нулевая проверка данных перед возвратом. 13:32 Рефлексия и создание элемента управления • Получение типа viewmodel с помощью рефлексии. • Создание нового элемента управления на основе типа. • Привязка модели представления к представлению через контекст данных. 14:41 Пример с моделью просмотра страницы процесса • Получение модели просмотра страницы процесса. • Замена «viewmodel» на «view» в полном имени. • Создание нового экземпляра представления и привязка контекста данных. 15:26 Тестирование генерации представлений • Проверка работы генерации представлений с моделью просмотра «test». • Настройка datacontext для отображения содержимого. • Временное удаление стилей для тестирования. 16:58 Команды для переключения страниц • Создание команд для перехода на главную страницу и страницу процесса. • Привязка кнопок к командам для изменения текущей страницы. • Исправление ошибок при компиляции. 19:15 Стилизация активных страниц • Настройка цвета фона для активной страницы. • Обновление стилей для активного фона и наведения курсора. • Привязка стиля кнопки к активному состоянию страницы. 22:08 Обновление стилей при изменении страницы • Наблюдение за свойством текущей страницы. • Уведомление об изменении свойства для класса кнопок. • Повторное обновление стилей при изменении текущей страницы. 23:12 Стилизация остальных кнопок • Аналогичная настройка для кнопки «Обработать» и других кнопок. • Использование закрытого класса active button для краткости. 23:45 Открытие двойной панели • Обсуждение процесса нажатия кнопки и открытия двойной панели. • Упоминание о частной строке const и классе кнопки active. 24:07 Привязка и стилизация кнопок • Необходимость выполнения привязки для обновления изображения. • Добавление класса active к кнопке при её активации. • Работа со стилями: границы, надписи, кнопки и указатель мыши. 25:00 Работа с классами и привязками • Изменение фона на значение динамического ресурса primary active background. • Использование массива классов для упрощения задачи. • Привязка к определённому объекту и стилизация представления. 25:58 Свойства активных страниц 26:40 Визуальный стиль и навигация 27:19 Завершение работы03. Реальный мир пользовательского интерфейса Avalonia (Просмотр основ модели) 00:00 Введение в viewmodels • Viewmodels позволяют привязывать элементы пользовательского интерфейса к данным в фоновом режиме. • Без viewmodels обновление интерфейса происходит вручную, что неэффективно. • Изменение данных в базе данных должно автоматически обновлять представление. 00:28 Установка инструментария • В Avalonia используется инструментарий Community MVVM Toolkit. • Установка инструментария через терминал: `dotnet add package community.mvvm`. • Создание папки `viewmodels` и базовой модели представления. 01:20 Базовая модель представления • Базовая модель представления наследуется от `ObservableObject`. • `ObservableObject` управляет автоматическим запуском событий при изменении значений. 01:40 Модель главного окна • Создание модели главного окна, наследуемой от базовой модели. • Переименование главного окна в `MainView`. • Добавление свойства `test` с атрибутом `observable`. 04:12 Привязка данных • Настройка контекста данных окна на основную модель представления. • Привязка текста к свойству `test` в модели представления. • Обновление пользовательского интерфейса при изменении данных. 06:00 Работа с контекстом данных • Перенос настройки контекста данных в серверный код. • Использование специального контекста данных `design.data` для предварительного просмотра. 08:24 Создание разборного меню • Реализация функции сворачивания бокового меню. • Привязка логического значения `expandedSideMenu` к видимости меню. • Использование преобразователя значений для изменения изображения меню. 11:13 Настройка изображения бокового меню • Создание приватного свойства для изображения бокового меню в формате SVG. • Объявление свойства `imageOfSideMenu` как наблюдаемого. 11:31 Обновление изображения Avalonia Skia • Добавление свойства notify для обновления изображения при изменении значения. • Изменение названия свойства и его общедоступность. • Создание исходного кода SVG и передача пути к ресурсу. 12:32 Генерация SVG-кода • Получение исходного текста SVG вместо изображения. • Создание нового изображения с установленным исходным кодом. • Использование интерполированной строки для представления изображений ресурсов. 13:17 Настройка изображения • Установка развёрнутого изображения как логотипа или свёрнутого изображения как значка. • Обновление свойства notify при изменении расширенного бокового меню. • Проверка работы логики обновления изображения. 14:26 Исправление ошибок URL • Решение проблемы с относительным URL-адресом без базового URL-адреса. • Указание проекта и пространства имён для корректной работы ресурсов. • Тестирование обновления изображения при изменении значения. 15:27 Обработка двойного щелчка • Подключение изображения к отображению при двойном щелчке мыши. • Создание команды для обновления бокового меню. • Реализация логики двойного щелчка и вызова команды. 16:19 Создание команды для бокового меню • Определение команды для скрытия или показа меню. • Привязка команды к контексту данных модели представления. • Проверка нулевой безопасности и корректное выполнение команды. 18:54 Изменение размера изображения • Обсуждение специфичности размера изображения для вида. • Использование преобразователя значений для изменения размера изображения. • Привязка видимости изображения к расширенному боковому меню. 21:05 Анимация бокового меню • Настройка анимации расширения и сжатия бокового меню. • Проблемы с высотой при анимации и возможные решения. • Привязка ширины границы к ширине боковой панели для корректной анимации. 22:49 Анимация и модели просмотра • Обсуждение возможности получения анимации при произвольной ширине. • Идея наложения одного изображения на другое для создания эффекта сетки. • Планирование стирания одного изображения и уменьшения другого по ширине. • Фокус на моделях просмотра, а не на анимации. 23:53 Основы моделей просмотра • Объяснение использования команд и свойств для привязки функций и полей. • Объединение элементов пользовательского интерфейса с помощью оператора привязки. • Возвращение значения true по умолчанию. • Переход к созданию страниц и обмену кнопками между ними. • Подчёркивание важности основ моделей просмотра для быстрого продвижения в разработке.00:00 Запуск приложения Avalonia • Запуск нового приложения Avalonia с боковым меню и кнопками. • Цель: улучшить визуальный ряд, добавив значки и улучшив эффекты затухания. 00:23 Работа с кнопками • Добавление элементов внутри кнопки: использование панели стека для размещения ярлыков. • Изменение ориентации кнопки на горизонтальную. • Вставка изображений и значков слева от кнопок. 01:45 Использование шрифтов для значков • Загрузка шрифтов с GitHub или другого источника. • Создание папки «шрифты» в разделе «Ресурсы». • Вставка фосфорных шрифтов и шрифта Aco Pro. 02:52 Настройка шрифтов в Avalonia • Изменение действия «Создать» на «ресурсы Avalonia». • Создание семейства шрифтов и настройка путей к шрифтам. • Указание фактического названия шрифта в Windows и его физического имени. 05:16 Применение шрифтов • Назначение шрифта окну верхнего уровня для каскадного распространения. • Использование селектора window и свойства семейства шрифтов. • Исправление смещения шрифта с помощью отступов. 08:24 Работа с фосфорными шрифтами • Импорт фосфорных шрифтов в приложение XAML. • Создание класса иконок и ввод значений в юникоде. • Пример ввода юникода для символа «дом». 10:10 Ввод юникодов • Объяснение способа ввода юникодов с использованием хэш-тегов. • Пример ввода юникода для символа «uplius». 10:42 Работа со стилями и шрифтами • Важно ставить точку с запятой в конце кода, чтобы избежать ошибок компиляции. • Исправление проблем с выравниванием шрифтов с помощью значков и класса. • Создание стиля для кнопок и надписей, настройка отступов. 11:40 Настройка семейства шрифтов • Применение точечных значков к различным элементам интерфейса. • Настройка свойства семейства шрифтов и люминофорной заливки. • Использование точечного контроля для более гибкой настройки шрифтов. 12:27 Работа с отступами и полями • Настройка отступов для элементов интерфейса. • Копирование и вставка кода для создания пользовательского элемента управления. • Обновление юникодов для соответствия значкам. 13:36 Настройка значка «Настройки» • Создание сетки и строки для значка «Настройки». • Решение проблемы с центрированием значка при использовании полей вместо отступов. • Эксперименты с различными стилями для кнопки «Настройки». 14:27 Исправление ошибок со шрифтом • Временное удаление отступов для демонстрации ошибки в высоте шрифта. • Применение класса «echo» для исправления ошибок со шрифтом. • Настройка стилей для кнопок с разными комбинациями текста и значков. 16:58 Прозрачные кнопки • Добавление прозрачного стиля для кнопок. • Настройка свойства background для прозрачных кнопок. • Проверка работы прозрачных кнопок в реальном приложении. 19:15 Анимация кнопок • Настройка анимации масштабирования текста при наведении курсора. • Определение значения по умолчанию для масштаба рендеринга. • Игнорирование радиуса поворота при масштабировании надписей. 22:18 Завершение настройки анимации • Настройка переходов для анимации кнопок. • Оживление кнопок путём изменения цвета и масштаба. • Финальная проверка работы анимации. 22:44 Настройка переходов • Создаём новый массив переходов для масштабирования. • Устанавливаем длительность перехода в 0,1 секунды. • Проверяем анимацию масштабирования. 23:31 Анимация цвета фона • Копируем переходы для цвета фона. • Масштабируем весь контент, а не только ярлык. • Применяем внутренние переходы для цвета фона. 24:41 Проверка анимации • Проверяем продолжительность анимации. • Анимируем изменение переднего плана от белого до светло-белого. • Убеждаемся, что анимация работает. 25:02 Настройка свойств • Настраиваем свойство render transform по умолчанию. • Включаем анимацию переходов. • Проверяем работу анимации. 26:04 Визуализация приложения • Сравниваем макет и реальное приложение. • Отмечаем приятный эффект при наведении курсора. • Настраиваем отступы и шрифт по вкусу. 26:26 Настройка шрифтов • Выбираем семейство шрифтов для прозрачности. • Устанавливаем семейство шрифтов «динамический ресурс» или «люминофор». • Исправляем ошибку с значком на этикетке. 27:32 Завершение работы • Добавляем пользовательские шрифты и исправляем ошибки. • Добавляем анимацию на кнопки. • Планируем следующую работу: создание моделей просмотра и навигация по страницам.00:00 Введение в Avalonia • Avalonia — кроссплатформенный UI для разработки приложений на Windows, Mac, Linux, мобильных устройствах, веб-приложениях и Tizen. • Автор ранее выпускал статьи об Avalonia и теперь планирует переделать своё коммерческое приложение Batch Process с помощью Avalonia. 00:58 Начало работы с Avalonia • Набросок интерфейса в Affinity Designer будет преобразован в Avalonia. • Установка Avalonia через Visual Studio или JetBrains Rider, который теперь бесплатен. 01:55 Создание проекта • Выбор между кроссплатформенным приложением, приложением MVVM и .NET-приложением. • Создание нового проекта «Пакетная обработка 3» в Rider. 03:45 Проверка работы приложения • Запуск приложения и проверка его работы. • Открытие предварительного просмотра интерфейса. 04:42 Структура приложения • Описание структуры приложения: боковая панель, главное окно с сеткой. • Настройка цвета фона с помощью палитры цветов. 05:40 Работа со стилями • Создание папки styles и документа со стилями Avalonia. • Включение стилей в XAML-файл приложения. 06:39 Ресурсы приложения • Создание ресурса primary background для цвета фона. • Обновление приложения после внесения изменений. 07:38 Использование панелей и сетки • Объяснение различий между панелями стека и сеткой. • Применение сетки для заполнения пространства и фиксированного размера одного из столбцов. 09:23 Применение сетки • Настройка расположения элементов в сетке. • Примеры использования сетки для заполнения пространства и фиксированного размера. 10:20 Использование привязок в пользовательском интерфейсе • Привязки заменяют фиксированные значения, например, FFOOO для красного цвета. • Динамические ресурсы ищутся в ресурсах приложения. • Интерфейс напоминает веб-разработку, используя конструкции, похожие на CSS и HTML. 11:16 Импорт логотипа в формате SVG • Создание папки assets и подпапки images. • Вставка логотипа в папку images и изменение типа сборки на ресурс Avalonia. 12:10 Настройка контейнера и отступов • Использование панели стека и универсального элемента-обёртки Border для добавления отступов. • Задание отступа в 20 пикселей. • Добавление сетки для заполнения оставшегося пространства. 13:08 Привязка SVG-изображения • Настройка источника и вкладки привязки для SVG-изображения. • Установка пакета avalonia.svg.skia для поддержки SVG. • Указание пути к файлу logo.svg. 15:05 Настройка размеров изображения • Задание ширины изображения 220 и изменение на auto для автоматического размера. • Настройка дизайнерского размера 800x450 и реальных размеров 1024x600. 16:55 Создание градиента фона • Добавление линейной градиентной кисти с ключом primary background gradient. • Указание начальной и конечной точек градиента в процентах. • Задание цветов градиента: 111214 и 151E3E. 18:33 Добавление кнопок • Добавление кнопок под изображением, настройка переднего плана на белый. • Выравнивание текста по горизонтали для заполнения кнопки. • Настройка интервала между кнопками в панели стека. 21:02 Добавление кнопки настроек • Создание сетки с параметрами auto и fill для нижней строки. • Размещение кнопки настроек во втором ряду с индексом 1. • Настройка Grid.Row для кнопки настроек. 21:46 Настройка боковой панели и кнопок • Замена кнопки на иконку в настройках. • Боковая панель воссоздана в виде физических элементов. • Внутренняя часть будет настоящей страницей с шаблонным кодом для переходов между страницами. 22:44 Стилизация кнопок • Добавление градиентного фона и установка ширины кнопки 200. • Горизонтальное выравнивание по растяжению для кнопки. • Использование метода setter для настройки свойств кнопки. 23:44 Настройка шрифта и цветов • Установка размера шрифта 20. • Создание сплошной кисти primary text для светлого оттенка. • Применение динамического ресурса primary text для цвета foreground. 24:48 Стилизация наведения курсора • Создание стиля для наведения курсора на кнопку. • Выбор шаблона «Презентация контента» для настройки цвета при наведении. • Изменение цвета переднего плана и фона при наведении. 27:07 Завершение настройки • Проверка эффекта наведения при увеличении масштаба кнопки. • Пересоборка проекта для применения стилей. • Планы по улучшению: увеличение шрифта, уменьшение отступов, добавление иконок, анимация. 28:03 Преимущества Avalonia • Быстрое создание приложения с хорошим внешним видом. • Простота и интуитивность интерфейса Avalonia. • Сравнение с другими UI-фреймворками, такими как Maui. 29:01 Рекомендации по обучению • Приглашение задавать вопросы и смотреть другие видеоуроки по Avalonia. • Рекомендация курса по WPF для понимания основ UI-разработки. • Обещание готового приложения к концу курса.00:00 Введение и цель • Цель: отобразить реальный звук на панели и обеспечить прокрутку графика. • Проблема: значок на измерителе громкости Yulian не сразу реагирует на изменение громкости. 00:24 Обновление графика • Необходимость заставить график прокручиваться. • Использование кнопки «Постоянное изменение» для обновления графика. 00:53 Работа с наблюдаемыми значениями • Обновление рядов графика до наблюдаемых значений. • Создание наблюдаемого набора значений в модели представления. 02:15 Инициализация и проверка • Использование функции инициализации для настройки серии. • Проверка работы графика после изменений. 03:50 Анимация графика • Удаление и добавление элементов для анимации графика. • Добавление случайных значений для создания плавности. 06:08 Проблемы с потоком пользовательского интерфейса • Необходимость работы в потоке пользовательского интерфейса. • Решение проблемы с быстрым обновлением графика. 07:36 Обработка аудиоданных • Вставка значений реального звука в график. • Инверсия и корректировка значений для корректного отображения. 09:16 Настройка диапазона значений • Ограничение диапазона значений для имитации реального звучания. • Имитация белой полосы на графике при разговоре. 10:25 Сравнение с измерителем громкости • Сравнение графика с измерителем громкости Yulian. • Замечание о задержке и усреднении сигнала на измерителе громкости. 11:05 Заключение • Подчёркивание различий в отображении звука на графике и измерителе громкости. 11:16 Отсрочка и буфер • Создание очереди для отсрочки данных. • Рассмотрение возможности создания мини-класса для буфера. • Разделение требований между аудиосервисом и моделью представления. 12:02 Логика и график • Перенос звуковой логики в модель представления. • Добавление значений на график для краткосрочных колебаний. • Настройка уровня громкости. 13:45 Определение кратковременной громкости • Корректировка определений кратковременной громкости. • Обновление значений кратковременной громкости. • Ограничение размеров очередей. 16:04 Задержка и усреднение • Увеличение задержки для краткосрочных лофтов. • Сравнение мгновенных и усреднённых значений звука. • Влияние задержки на форму графика. 17:17 Математические операции • Использование максимального значения вместо среднего. • Анализ формы графика при использовании максимального значения. • Попытка сбалансировать задержку и детализацию графика. 20:26 Усреднение и очередь • Применение усреднения для улучшения графика. • Настройка очереди для средних значений. • Достижение более точного графика. 22:17 Освобождение очереди • Освобождение очереди при превышении средних значений. • Постоянное сокращение среднего значения. • Необходимость корректировки средних показателей. 23:30 Анализ пиков и роста • Обсуждение достижения пика и последующего устойчивого роста. • Упоминание о необходимости говорить громче для достижения пика. 24:09 Проблемы с очередью • Объяснение концепции «когда в среднем» для управления очередью. • Проблема потери среднего показателя при очистке очереди. • Решение увеличить размер очереди до 30 для поддержания среднего значения. 25:10 Сравнение с измерителем громкости • Сравнение текущего поведения с измерителем громкости по Джулиану. • Обнаружение пилообразного движения вверх-вниз вместо плавного. 26:09 Попытки улучшения • Предложение убрать 51 элемент из очереди при заполнении. • Добавление элементов обратно при снижении уровня. • Продолжение тестирования для улучшения поведения. 27:34 Итоги и дальнейшие шаги • Признание сложности математического расчёта обработки звука. • Удовлетворение текущим средним значением для отображения графика. • Планы по улучшению графика и добавлению временных рамок. 29:33 Заключение и планы • Подведение итогов работы над приложением. • Обсуждение возможности создания мобильного и кросс-платформенного приложения. • Призыв к зрителям предложить дальнейшие шаги.00:00 Обзор графиков для аудио • Обсуждение различных вариантов графиков для аудио, найденных через Discord. • Упоминание сюжета Скотта, поддерживаемого Avalonia, и микрокарт. • Переход к основному графику. 00:52 Изучение документации • Отсутствие примеров и документации для графиков. • Обзор PDF-документации, которая выглядит как линейный график. • Предпочтение живых графиков. 01:37 Установка и настройка проекта • Установка пакета Nougat и очистка проекта от ненужных частей. • Обновление проекта до версии preview 8 и .NET 7. • Добавление Live Chart Skier в проект. 03:22 Создание ViewModel и добавление диаграммы • Создание ViewModel и добавление свойства series. • Импорт недостающих ссылок и настройка представления. • Вставка диаграммы в пользовательский интерфейс. 04:44 Тестирование диаграммы • Проверка работы диаграммы и её анимации. • Необходимость автоматической прокрутки и добавления осей. • Настройка масштаба и элементов управления. 05:42 Настройка шкалы и картографирования • Настройка шкалы от 0 до -69. • Работа с картографами и всплывающими подсказками. • Автоматические обновления данных на основе ViewModel. 08:53 Настройка заливки и толщины линий • Использование однотонной краски для заливки. • Настройка толщины штриха и размера геометрии. • Удаление геометрии для улучшения вида графика. 11:33 Финальная настройка • Проверка направления заливки и расположения осей. • Дальнейшая настройка свойств заливки и линий. 11:39 Введение в заливку • Заливка включает сплошной цвет, геометрическую заливку и обводку штрихом. • Геометрическая заливка имеет точки. 11:51 Контроль направления заливки • Направление заливки кажется неконтролируемым. • Область заполняется выше и ниже нуля. 12:12 Создание собственной геометрии • Возможность создания собственной геометрии для заливки. • Идея инверсии данных для изменения направления заливки. 13:04 Управление осями • Отсутствие возможности управления осями в текущей версии. • Анализ API для получения информации об осях. 14:02 Инверсия оси Y • Привязка оси Y к графику. • Установка инвертированного значения оси. 15:23 Проблемы с заливкой • Инверсия оси не решает проблему заливки. • Необходимость изменения данных для инверсии заливки. 16:42 Настройка меток осей • Изменение меток осей и их положения. • Настройка минимального шага и делителя. 18:21 Ограничение данных • Ограничение значений от минимального до максимального. • Игнорирование значений за пределами диапазона. 19:23 Функция label • Функция label преобразует число в метку. • Инверсия функции label для преобразования чисел. 20:59 Преобразование значений • Ограничение значений от 0 до -60. • Преобразование отрицательных значений в положительные. • Преобразование чисел в метки. 22:11 Проблемы с математикой и данными • Обсуждение возможных ошибок в математике при работе с данными. • Манипуляции с данными для правильного заполнения диапазона от 0 до 60. • Необходимость инверсии значений для корректного отображения. 23:10 Обработка данных и создание меток • Обработка данных, поступающих в таблицу, для создания меток. • Получение правильного графика с правильным расположением осей. • Попытка ограничить диапазон отрицательных значений. 23:30 Работа с метками и осью • Обсуждение возможности скрытия меток и использования значений null или blank. • Проблемы с отображением меток при возврате значения null. • Анализ поведения меток при выходе за пределы коллекции. 25:51 Создание собственной оси • Решение скрыть существующую ось и создать новую. • Наложение сетки поверх графика и проведение линий. • Добавление отступов для уменьшения размера оси. 26:52 Настройка сетки и элементов • Использование той же сетки, что и для счётчика. • Создание прямоугольника внутри элемента сетки. • Настройка ориентации и заливки элементов. 28:15 Добавление меток и корректировка стиля • Добавление меток с нулевым значением содержимого. • Корректировка размера надписи и добавление полосы с линией. • Настройка непрозрачности и высоты элементов. 31:07 Проверка и корректировка сетки • Проверка заполнения сетки и устранение проблем с выравниванием. • Корректировка вертикального выравнивания и непрозрачности. • Вставка дополнительных элементов для заполнения пробелов. 35:06 Финальная настройка сетки • Удаление определений столбцов и использование автоопределения. • Размещение всех надписей в один столбец и прямоугольников — в один. • Уточнение настроек сетки и строк для корректного отображения. 35:49 Создание сетки и выравнивание текста • Обсуждение создания сетки с количеством строк до девяти. • Настройка горизонтального выравнивания текста для смещения вправо. • Достижение идеального выравнивания текста и прямой линии. 36:55 Прокрутка графиков 37:54 Работа с данными и диаграммами 38:54 Заключение00:00 Запуск Avalonia на Windows • Программа Avalonia должна быть кроссплатформенной и работать на Windows. • Проект открыт в Visual Studio, приложение для настольных компьютеров запускается. • Звук не воспроизводится, но микрофон работает нормально. 00:38 Добавление панели регулировки громкости • Планируется добавить панель регулировки громкости с анимацией. • Идея: белый цвет расширяется вверх, затем появляется красный при достижении определённой линии. 01:07 Настройка ViewModel • Добавление новой частной собственности для высоты панели регулировки громкости. • Высота контейнера volume задаётся в коде, а не в конструкторе. 02:44 Создание панели регулировки громкости в конструкторе • Создание панели регулировки громкости с именем volume bar. • Связывание высоты полосы громкости с высотой отскока полосы громкости. 04:21 Настройка высоты панели регулировки громкости • Определение высоты панели регулировки громкости в обратном вызове данных. • Расчёт высоты панели на основе уровня громкости в децибелах. 06:04 Исправление ошибок в отображении • Проблема с отображением панели регулировки громкости из-за отсутствия привязки. • Обновление устройства и проверка захвата микрофона. 09:28 Оптимизация отображения панели • Вертикальное выравнивание панели регулировки громкости. • Медленное обновление значений громкости. 10:39 Улучшение отображения стрелки регулировки громкости • Расчёт высоты стрелки регулировки громкости на основе уровня громкости. • Стрелка становится более отзывчивой, но частота обновления остаётся низкой. 11:57 Настройка частоты обновления • Настройка частоты обновления сервиса захвата. • На Mac частота обновления по умолчанию выше, чем на Windows. • Смягчение слишком быстрой частоты обновления. 12:46 Настройка плавности движений • Обсуждение необходимости замедления периода для достижения плавности движений. • Упоминание о возможном увеличении числа до двадцати для достижения желаемого результата. 13:56 Усреднение значений • Применение среднего значения из трёх для сглаживания движений. • Идея удвоения среднего значения для другой стрелки. 14:31 Замедление обновления текста • Предложение использовать счётчик для обновления текста каждые три раза. • Реализация счётчика обновлений для текста и графиков. 17:07 Инверсия значений • Необходимость инверсии значений для правильного отображения громкости. • Объяснение использования поддельных значений для наглядности. 17:48 Ограничение значений • Ограничение максимального значения в пользовательском интерфейсе до 60. • Настройка высоты шкалы громкости и контейнера громкости. 19:00 Работа с аудиосервисом • Переработка кода для повторного использования аудиосервиса. • Добавление функций запуска и остановки записи. 22:21 Инициализация и освобождение устройств • Инициализация захвата звука с определённого устройства. • Освобождение ресурсов при остановке записи. 23:57 Проверка интерфейса • Проверка работы интерфейса после всех изменений. • Подготовка к добавлению графика. 24:15 Исследование графиков • Обзор документации Skia и Avalonia для построения графиков. • Упоминание обновлений и новых возможностей. 26:01 Работа с образцами • Изучение образцов и предварительного просмотра. • Оценка улучшений в документации и образцах. 26:13 Начало обсуждения рисования • Обсуждение рисования в целом, а не только графиков. • Упоминание шаблонов данных, рутины и пользовательских стилей. 26:29 Анализ образцов • Образцы не соответствуют ожиданиям. • Отсутствие конкретных решений в имеющихся образцах. 26:42 Поиск решений • Проверка наличия графиков в доступных решениях. • Поиск дополнительных ресурсов через Google. 27:15 Специфические требования • Необходимость рисования кривых в пользовательском интерфейсе. • Использование специфически настроенного элемента управления. • Возможность полного контроля над процессом рисования. 27:56 Начало реализации • Начало работы над программированием, графикой и анимацией. • Создание эллипсов, линий, многоугольников и графиков. • Планирование создания специального элемента управления для передачи аудиоданных. 27:56 Заключение • Подведение итогов обсуждения. • Надежда на полезность материала. • Анонс следующего выпуска.00:00 Введение и установка библиотеки • Замена кода вывода изображения на код обработки звука. • Использование библиотеки NVVI для обработки звука. • Установка библиотеки через меню Avalonia Loudness. 00:37 Обзор возможностей NVVI • NVVI работает с дискретными сигналами, позволяя обрабатывать аудиосэмплы. • Возможность извлечения данных, таких как уровень громкости и частота. • Утилиты для преобразования сигналов в децибелы и другие единицы измерения. 01:35 Измерение громкости • Фокус на измерении сигнала громкости. • Отображение значения громкости в разных форматах: число, полоса со стрелкой, интегрированная динамика. • Объяснение формата WAV как файла PCM с 16 битами на сэмпл. 02:33 Преобразование буфера данных • Преобразование необработанного буфера данных в значение громкости. • Привязка значения громкости к свойству в модели представления. • Создание приватного вспомогательного класса для обработки данных. 04:55 Захват звука • Создание устройства захвата звука. • Начало захвата звука и обработка данных. • Управление устройством захвата и его удаление при закрытии приложения. 07:49 Анализ данных WAV • Анализ формата WAV как шестнадцатибитного PCM-файла. • Вычисление количества сэмплов в буфере. • Преобразование буфера в дискретный сигнал с частотой дискретизации 44100 Гц. 11:02 Извлечение значений сэмплов • Извлечение шестнадцатибитных значений сэмплов из буфера. • Использование бинарного ридера для чтения данных. • Деление значений на 32768 для преобразования в формат с плавающей запятой. 12:42 Расчёт громкости в децибелах • Выражение значения громкости в децибелах. • Использование вспомогательного класса Scale для преобразования значений. • Получение значения громкости в децибелах с помощью класса Scale. 13:27 Вычисление децибел • Использование RMS для вычисления децибел. • RMS рассматривается как среднее значение энергии сигнала. 13:58 Установка модели представления • Переход в новый поток для установки модели представления. • Выполнение команды для установки значения краткосрочной громкости. 14:31 Проблемы с вычислением • Вычисление лофтов для каждого сэмпла и обновление пользовательского интерфейса. • Обнаружение некорректного поведения значений. 15:35 Анализ краткосрочных значений • Сравнение краткосрочных и усреднённых значений. • Усреднённое значение остаётся на уровне 20, в то время как краткосрочное падает до −50. 16:34 Разработка алгоритма усреднения • Использование таймера для усреднения образцов за секунду. • Расчёт новых средних значений на основе данных за секунду. 17:15 Реализация алгоритма усреднения • Создание массива чисел с плавающей запятой для хранения образцов. • Замена списка на стек для удобства добавления и удаления элементов. 19:16 Исправление ошибок в алгоритме • Исправление логики добавления и удаления элементов в стеке. • Переход на использование очереди для корректного извлечения элементов. 20:23 Тестирование и корректировка • Тестирование усреднённых значений с 40 выборками. • Обнаружение некорректных расчётов и необходимость корректировки средних значений. 21:32 Обработка стрелки и полосы • Сопоставление значения стрелки с кратковременными углами наклона. • Расчёт размера полосы на основе мгновенных углов наклона. 22:01 Заключение • Призыв к участию в Discord для дальнейшего обсуждения и разработки. • Подчёркивание важности наличия информации о звуке и громкости. • Обещание продолжить работу над графиком и функциональностью приложения.00:00 Начало работы со звуком • Настройка звука в LUFs. • Привязка пользовательского интерфейса Avalonia к звуковому коду. • Планирование создания подвижного графика. 00:37 Очистка кода и объединение сервисов • Удаление ненужного кода и очистка основного файла просмотра. • Объединение службы захвата звука и интерфейса. • Переименование объединённого сервиса в «Сервис захвата звука». 02:21 Создание фиктивной модели • Удаление фиктивного снимка и создание объединённого сервиса. • Добавление идентификатора по умолчанию для фиктивных объектов. 03:10 Комментарии и документация • Добавление комментариев к коду для улучшения документации. • Перенос функций в службу захвата звука. 05:01 Оптимизация кода • Удаление ненужных комментариев и очистка кода. • Минимизация количества личных пользователей. 06:37 Инициализация службы захвата • Инициализация службы захвата звука и начало записи. • Обсуждение методов записи звука и обратного вызова. 08:31 Разделение ответственности • Исключение службы захвата из модели основного вида. • Привязка сервиса к модели представления. 10:04 Загрузка настроек и инициализация • Асинхронная загрузка данных и настройка служб. • Динамическое обновление размеров элементов управления. 12:05 Завершение инициализации • Начало захвата звука после инициализации. • Автоматическое начало записи. • Предоставление опций «запись» и «пауза». 13:11 Импорт файлов и настройка громкости • Необходимо импортировать отсутствующие файлы. • Нужно настроить громкость и обеспечить обратный вызов для отправки данных в viewmodel. 13:51 Раскрытие функций и документация • Раскрываются публичные функции «старт» и «стоп». • Используются комментарии для документации, наследуемые от интерфейса. 14:45 Обработка аудиоданных • Создаётся обработчик для возврата изменённых звуков. • Добавляется класс «audio chunk data» для хранения информации об одном фрагменте аудио. 15:53 Анализ громкости • Добавляются кратковременные люфты и интегрированная громкость. • Используется класс «запись» для хранения общедоступных свойств. 18:07 Организация обратного вызова • Организуется обратный вызов для получения следующего фрагмента аудиоданных. • Переименовывается метод «захваченный фрагмент аудио». 19:17 Вычисление значений • Вычисляется полезная информация из звукового фрагмента. • Создаётся новый звуковой фрагмент для обработки данных. 23:08 Привязка данных к интерфейсу • Данные по фрагменту аудио привязываются к пользовательскому интерфейсу. • Привязываются кратковременная громкость и другие параметры. 24:29 Тестирование и корректировка • Тестируется работа системы. • Внедряется базовая служба захвата звука. • Проверяется правильность привязки свойств. 26:30 Визуализация данных • Данные визуализируются на экране. • Лофты умножаются на 0,9 для отображения полезных значений. • Планируется исправление значений при написании аудиокода. 27:15 Обновление пользовательского интерфейса • При запуске программы пользовательский интерфейс обновляется и меняется. • Все элементы интерфейса, кроме громкости, работают корректно. • Наблюдается медленное снижение реальных значений. 27:41 Настройка стрелки громкости • Необходимо сделать так, чтобы стрелка громкости двигалась плавно. • Планируется установить измеритель громкости на панели, которая будет двигаться вверх и вниз вместе с реальными значениями. • Стрелка будет двигаться как упругая пружина с задержкой, создавая эффект S-образной кривой. 28:37 Структура сервиса и модели представления • Важно структурировать сервис и модель представления для чистоты представления. • Не стоит тратить время на создание идеального интерфейса, если он не будет использоваться. • Сначала нужно убедиться, что интерфейс нравится, а потом совершенствовать его. • Не начинайте с идеально доработанного кода, чтобы не пришлось всё переделывать.00:00 Введение и цель 01:04 Начало разработки 01:34 Настройка библиотек 03:27 Использование ChatGPT 04:49 Проблемы с кодом 08:36 Анализ ошибок 10:16 Переход к образцам 11:54 Разработка собственного решения 13:20 Инициализация аудиозаписи 14:40 Настройка параметров записи 15:22 Обработка данных и обратные вызовы 16:54 Управление записью 17:30 Делегаты и события 19:27 Создание экземпляра приложения 20:13 Запись WAV-файлов 21:30 Проверка устройств 25:28 Инициализация и проблемы 26:38 Создание сервиса записи звука 27:12 Управление сервисом 27:36 Инициализация и захват звука 28:06 Работа с буфером 28:49 Запись звука в файл 30:08 Реализация таймера 31:32 Проверка работы 32:29 Исправление ошибок 34:16 Анализ аудиоданных 35:12 Визуализация данных 37:01 Заключение00:00 Введение и цель • Необходимо найти способ записывать и передавать аудио в потоковом режиме с Mac, Windows и Linux. • Если не удастся найти готовое решение, придётся создать код самостоятельно. • Цель — найти код, который позволит передавать аудио с любого подключённого микрофона. 00:31 Начало исследования • Проект использует Avalonia и .NET Core для получения звука. • Начинаем поиск решений через Google, ищем статьи и пакеты NuGet. • Планируем экспериментировать с различными пакетами. 01:45 Обзор OpenTK .NET • OpenTK использует классы захвата звука для сбора данных с микрофона на разных платформах. • Поддерживает Windows, Linux и Mac. • Имеет высокую стабильность и поддержку. 02:42 Анализ других вариантов • Рассматриваем пример с процентной шкалой уровня звука. • Оцениваем документацию и активность разработки. • Сравниваем OpenTK с другими вариантами. 06:31 Проблемы с Naudio • Naudio поддерживает только Windows, что ограничивает его использование. • Для Mac потребуется другое решение. 07:52 Попытка использования SoundLib • Пытаемся использовать оболочку C# для кроссплатформенного аудио SoundLib. • Возникают проблемы с одобрением файлов на Mac. • Исследуем ошибки и пытаемся их исправить. 10:11 Отладка кода • Удаляем устройство вывода, чтобы проверить работу кода. • Обнаруживаем ошибку ввода-вывода звука. • Продолжаем отладку, проверяя использование кольцевого буфера. 11:00 Создание кольцевого буфера • Создание кольцевого буфера для хранения данных. • Длительность буфера вызова составляет 30 секунд. • Переписывание кода под конкретные нужды. 11:16 Работа с указателями и байтами • Считывание свободных байтов из указателя записи. • Использование расширенного указателя чтения для подсчёта байтов в кадре. • Начало чтения с определённого количества кадров. 12:06 Проблемы с задержкой микрофона • Упоминание проблемы с задержкой микрофона. • Серверная часть равна нулю, что указывает на отсутствие проблем. 12:46 Выбор устройства по умолчанию • Если значение device равно null, выбирается устройство по умолчанию. • Регистрация выходных данных при нулевом результате. 13:18 Проверка совместимости частоты дискретизации • Проверка совместимости частоты дискретизации устройства вывода с форматом. • Устройство ввода поддерживает формат и частоту дискретизации. 14:04 Настройка входного потока • Необходимость включения устройства вывода для выбора макета. • Использование одного и того же устройства для входа и выхода. 15:30 Расчёт частоты дискретизации и задержки • Точный расчёт частоты дискретизации, количества байт на кадр и времени задержки. • Сохранение данных в буфере без его создания. 18:43 Чтение данных из потока • Получение каналов, считывание количества байт на выборку. • Копирование данных из потока в буфер памяти. 20:11 Анализ полученных данных • Проверка формата и частоты дискретизации данных. • Анализ необработанного звука с нулями и единицами. 21:12 Исправление ошибок чтения • Удаление цикла for для буфера. • Проверка работы системы после исправления. 22:12 Вывод данных на консоль • Вывод данных на консоль для анализа. • Суммирование байтов и вывод их на экран. 23:28 Анализ значений данных • Анализ значений данных, полученных из аудиозаписи. • Понимание, что данные не обязательно связаны с объёмом. 23:54 Запись звука в код • Запись звука легко включается в код. • Для записи звука требуется небольшой фрагмент кода и обратный вызов. • Можно передавать данные в потоковом режиме вместо записи четырёх байтов. 24:46 Тестирование и интеграция • Автор предлагает протестировать запись звука на разных микрофонах. • Планируется интеграция записи в чтение аудиоданных и их визуальную обработку. • Если тест пройдёт успешно, интеграция будет продолжена.010. Пользовательский интерфейс Avalonia - Всплывающее управление 00:00 Введение в всплывающее окно • Обсуждение специфичности всплывающего окна для исходного кода и SAML. • Упоминание о свойствах всплывающего элемента управления: «открыто», «размещение», «цель». • Решение проверить использование всплывающего элемента управления на YouTube. 01:00 Тестирование всплывающего окна • Вставка всплывающего окна в кнопку и проверка его работы. • Обнаружение проблем: отсутствие анимации и неправильная позиция. 01:35 Настройка свойств всплывающего окна • Прикрепление всплывающего окна к элементам управления без встроенной поддержки. • Эксперименты с выравниванием нижнего и верхнего краёв по левому краю. 02:31 Проблемы с позиционированием • Трудности с настройкой направления открытия всплывающего окна. • Попытка выровнять верхний край по левому краю для вертикального открытия. 04:01 Стилизация всплывающего окна • Начало стилизации всплывающего окна с помощью селектора. • Удаление предустановленных стилей и настройка прозрачности, отступов и полей. 06:06 Анализ предопределённых границ • Обнаружение предопределённых верхних и нижних границ всплывающего окна. • Попытка создать пользовательский стиль с помощью прямоугольника. 07:03 Переопределение всплывающего окна • Просмотр исходного кода всплывающего окна на GitHub. • Переопределение всплывающего презентатора и поиск заранее подготовленных отступов. 09:16 Удаление отступов • Использование отрицательных отступов для удаления запаса всплывающего окна. • Настройка верхних и нижних границ на прозрачные для создания бесшовного стиля. 10:12 Создание пользовательского всплывающего окна • Создание копии стандартного всплывающего окна для настройки вертикального смещения. • Копирование содержимого класса и настройка смещения по вертикали. 12:36 Тестирование смещения • Установка смещения по вертикали для всплывающего окна. • Проверка эффекта изменения положения всплывающего окна. 13:38 Проблемы с всплывающим окном • Всплывающее окно само определяет направление появления. • При нажатии на кнопку вниз возникает странный эффект. • Ошибки из-за проблем с всплывающим окном. 14:37 Анализ кода • Код использует всплывающий класс, который является элементом управления. • При открытии используется всплывающее сообщение с наложением. • Обновление размера, установка дочерних элементов и положения требуют много работы. 15:44 Сложности анимации • Анимация требует времени, а всплывающее окно либо есть, либо нет. • Класс всплывающих окон не поддерживает анимацию и пользовательское позиционирование. • Проблемы с мерцанием и непредсказуемым направлением появления. 16:35 Потенциал и ограничения • Всплывающее окно игнорирует макет и появляется вне заданного положения. • Отсутствие анимации и пользовательского позиционирования. • Большой объём работы для отображения всплывающего окна. 17:15 Планы по улучшению • Создание уникального пользовательского элемента управления для повторного использования. • Запрос функции на GitHub для улучшения всплывающего окна. • Поддержка анимации, вертикального и горизонтального смещения, определённого направления движения. 18:15 Родительский контроль • Использование родительского элемента для определения положения всплывающего окна. • Динамическое создание элемента управления с привязкой к сетке. • Привязка свойств к элементу управления. 20:32 Прикрепление к кнопке • Размещение элемента управления внутри кнопки как прикреплённого свойства. • Определение родителя верхнего уровня для добавления всплывающего окна. • Имитация поведения базового прикреплённого всплывающего экрана. 23:35 Создание нового стиля • Замена элемента управления на пользовательский. • Создание нового стиля «анимированное всплывающее окно». • Добавление стиля в приложение и тестирование на главном экране. 25:26 Работа с шаблоном и содержимым • Использование шаблона для управления содержимым. • Необходимость задания имени для корректной работы. • Настройка всплывающего окна с шаблонным элементом управления по умолчанию. 26:11 Проблемы с границей и выбор типа элемента • Проблема с предопределённой границей, которая мешает правильной работе. • Выбор между различными типами элементов управления: элемент ввода, макет, визуальный элемент. • Создание нового типа элемента управления и его скрытие по умолчанию. 27:18 Управление контентом • Изменение шаблона управления для свободного размещения контента. • Использование элемента управления контентом для размещения ярлыка с контентом. • Настройка переднего плана для лучшего отображения на чёрном фоне. 28:03 Стилизация и привязка контента • Изменение шаблона управления для передачи фактического контента. • Привязка содержимого к шаблону привязки содержимого. • Добавление кнопки в содержимое элемента управления. 29:28 Определение анимированного всплывающего окна 30:27 Настройка z-индекса 31:57 Стилизация и выравнивание 33:35 Проверка работы и дальнейшие улучшения 36:12 Заключение00:00 Создание расширяемого элемента управления • Обсуждение необходимости поддержки расширяемого элемента управления. • Проблема с текущим всплывающим окном: установка размера один раз и отсутствие его изменения. • Создание расширителя и добавление содержимого. 00:57 Настройка расширителя • Проверка состояния расширителя и присвоение свойства `expanded` значения `true`. • Проблема фиксации высоты при расширении. 01:24 Тестирование расширителя в сетке • Вставка расширителя в рамку и наблюдение за его расширением в сетке. • Ожидание поведения, аналогичного обычному всплывающему элементу управления. 02:28 Анимация элемента управления • Объяснение процесса анимации элемента управления до и обратно. • Установка ширины и высоты для активации анимации. 04:00 Проблемы с контрольными точками • Трудности с получением контрольных точек при отладке. • Решение проблемы путём установки ширины и высоты в `NaN`. 06:10 Обновление желаемого размера • Определение момента для обновления желаемого размера при закрытии панели управления. • Использование систем защиты от сбоев для предотвращения дублирования кода. 10:04 Финальная настройка анимации • Обновление желаемого размера на основе текущего размера элемента управления. • Проверка завершения анимации перед обновлением размера. 12:14 Тестирование и завершение • Тестирование анимации и подтверждение её гладкости. • Подтверждение надёжной поддержки расширяемого всплывающего окна. 12:58 Добавление свойства непрозрачности анимации • Создание логического свойства непрозрачности анимации с значением `true` по умолчанию. 13:23 Анимация непрозрачности • Копируем и вставляем код для анимации непрозрачности наложения. • Устанавливаем анимацию непрозрачности на основе свойства. • Сохраняем исходную непрозрачность для элемента управления. 13:57 Проверка анимации • Проверяем, что при полном открытии непрозрачность сбрасывается до исходного значения. • Учитываем, что при короткой анимации непрозрачность может быть ниже 100%. 14:20 Создание расширителя анимации • Создаём модель представления с списком списков для четырёх расширителей. • Каждый элемент списка будет иметь заголовок и подконтент. • Привязываем модель представления к пользовательскому интерфейсу. • В пользовательском интерфейсе появится список с расширителями, привязанными к другому списку. 14:20 Итоги • Поддерживаем расширение и сворачивание с помощью контроля. • Добавляем приятную затухающую непрозрачность.00:00 Начало работы со стрелкой • Обсуждение рисования стрелки-индикатора. • Планирование анимации движения стрелки вверх и вниз. • Подготовка к работе с реальным звуком. 00:50 Создание контура стрелки • Замена прямоугольника контуром для рисования стрелки. • Заполнение контура белым цветом и добавление данных. • Начало рисования стрелки с точек x и y. 02:07 Настройка размера стрелки • Увеличение ширины стрелки до 20 раз. • Сравнение с оригинальной стрелкой измерителя громкости Yulin. • Корректировка размеров стрелки. 04:12 Привязка стрелки к объекту недвижимости • Установка позиции стрелки на холсте. • Создание наблюдаемого свойства «положение в процентах объёма». • Привязка стрелки к объекту недвижимости. 05:41 Анимация стрелки • Разработка функции инициализации и таймера. • Установка интервала таймера на 60 секунд. • Тестирование анимации движения стрелки. 08:16 Реализация синусоидальной волны • Замедление таймера на 5 секунд для более плавной анимации. • Вычисление синусоидальной волны на основе тика таймера. • Умножение синусоидальной волны на масштаб 100. 10:30 Настройка частоты кадров • Разделение тика на число с плавающей запятой для сохранения точности. • Тестирование анимации на 120 кадрах в секунду. • Возвращение к 60 кадрам в секунду и дальнейшее замедление процесса. 11:28 Определение масштаба • Вместо случайного масштабирования предлагается определить масштаб на основе высоты холста. • Используется код анимированных всплывающих окон для определения размера объектов. • При рендеринге запускается таймер для обновления свойства размера. 12:28 Использование таймера • Таймер определения размера используется для получения желаемого размера за вычетом границ сетки. • Таймер тайм-аута определяет завершение автоматического определения размера при масштабировании. • Обновление размера происходит, когда изображение перестаёт двигаться на 100 миллисекунд. 13:45 Создание универсального метода • В конструкторе главного представления создаётся новый таймер. • Метод обновления размеров становится универсальным и может использоваться в разных местах. 15:09 Настройка размера контейнера • Устанавливается процент громкости и размер контейнера для объёма. • Размер контейнера устанавливается на 500, но требуется настройка на фактический размер холста. 18:27 Проблемы с размером • Желаемый размер контейнера для объёма не работает должным образом. • Границы контейнера имеют значение, но расчёты размера не учитываются. 19:36 Коррекция размера • Размер контейнера сокращается вдвое для учёта синусоидальной волны. • Возможность указания размера от 0 до 100 достигается через преобразователь значений. 20:31 Настройка диапазона • Настраиваются минимальные и максимальные значения для масштабируемой стрелки. • Стрелка визуально масштабируется в точном диапазоне. • Планируется добавление реакции стрелки на реальный звук для более реалистичного отображения уровня громкости.