Ленинский Букварь - все видео

Новые видео из канала RuTube на сегодня - 17 April 2026 г.

06. Avalonia UI Real World (Page Layout)
Ленинский Букварь
  17.04.2026
05. Avalonia UI Real World (Dependency Injection Factory Pattern)
Ленинский Букварь
  17.04.2026
04. Avalonia UI Real World (Page Navigation)
Ленинский Букварь
  17.04.2026
03. Avalonia UI Real World (View Model Basics)
Ленинский Букварь
  17.04.2026
02. Avalonia UI Real World (Fonts And Animations)
Ленинский Букварь
  17.04.2026
01. Avalonia UI Real World (Images & Buttons)
Ленинский Букварь
  17.04.2026
025. Avalonia UI - Live Audio Chart
Ленинский Букварь
  17.04.2026
024. Avalonia UI - Live Charts 2 Integration
Ленинский Букварь
  16.04.2026
021. Avalonia UI - Calculating Loudness
Ленинский Букварь
  16.04.2026
022. Avalonia UI - Audio Service Provider
Ленинский Букварь
  16.04.2026
020. Avalonia UI - Can ChatGPT Write Our Audio Code
Ленинский Букварь
  16.04.2026
019. Avalonia UI - Capturing Microphone Audio
Ленинский Букварь
  16.04.2026
010. Avalonia UI - Flyout Control
Ленинский Букварь
  16.04.2026
014. Avalonia UI - Expander Control On Popup
Ленинский Букварь
  16.04.2026
018. Avalonia UI - Animating Over Time (To 100% Height)
Ленинский Букварь
  16.04.2026
013. Avalonia UI - Open & Close Animation
Ленинский Букварь
  16.04.2026
017. Avalonia UI - Control Themes Styling
Ленинский Букварь
  16.04.2026
016. Avalonia UI - Binding To Grouped Collections
Ленинский Букварь
  16.04.2026
015. Avalonia UI - MVVM Injecting Services
Ленинский Букварь
  16.04.2026

Видео на тему: Ленинский Букварь


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 Настройка диапазона • Настраиваются минимальные и максимальные значения для масштабируемой стрелки. • Стрелка визуально масштабируется в точном диапазоне. • Планируется добавление реакции стрелки на реальный звук для более реалистичного отображения уровня громкости.00:00 Поддержка закрытия всплывающего окна • Необходимо поддержать закрытие всплывающего окна, которое сейчас можно только открыть. • Для этого создаём новый элемент управления underlay внутри анимированного всплывающего окна. 00:37 Создание элемента управления underlay • В конструкторе создаём новый элемент управления underlay. • Устанавливаем его границу и делаем фон прозрачным, сначала делая его красным для видимости. 01:27 Настройка индекса z и события нажатия мыши • Изменяем индекс z на 9 для прозрачности. • Добавляем событие нажатия указателя мыши для закрытия всплывающего окна. 02:32 Имитация поведения закрытия • Устанавливаем диапазон строк и столбцов для имитации поведения закрытия. • Определяем момент внедрения элемента управления underlay при полном открытии контроллера. 03:44 Перенос кода в новый метод • Переносим код в новый метод для завершения анимации открытия и закрытия. • Проверяем работу метода через точки останова. 06:10 Вставка и удаление подложки • Вставляем подложку при полном открытии контроллера, если родительским элементом является сетка. • Удаляем подложку при закрытии, проверяя наличие в сетке. 08:18 Настройка свойств сетки • Устанавливаем прикреплённые свойства для сетки, диапазона строк и столбцов. • Проверяем наличие определений строк и столбцов в сетке. 11:18 Анимация непрозрачности • Настраиваем анимацию непрозрачности подложки для естественного исчезновения. • Уменьшаем непрозрачность в начале анимации открытия. 14:24 Завершение настройки • Переносим настройки непрозрачности в команду «Открыть». • Проверяем работу анимации в конструкторе. 15:07 Настройка переходов • Настраиваем двойной переход для непрозрачности. • Проверяем работу переходов в фоновом режиме. 16:13 Анимация непрозрачности • Непрозрачность не устанавливается напрямую, а анимируется вместе с элементом управления. • Используется таймер анимации и бегущая строка. • Подложка анимируется для открывания и закрывания элемента управления. 17:04 Создание анимации подложки • Подложка создаётся с равными значениями. • Процент анимации рассчитывается на основе размера. • Полученный процент умножается на 0.2 для желаемого объёма перехода. 17:29 Эффект анимации • Один цикл анимации создаёт плавный переход фона. • Возможность увеличения непрозрачности фона до определённого свойства. 17:48 Свойства анимации • Используются свойства open и время анимации. • Непрозрачность подложки задаётся двойным значением. • По умолчанию непрозрачность равна 0.2. 18:46 Обновление кода • Обновление кода для добавления подложки или пастообразного слоя. • Возможность полного покрытия или установки определённого значения непрозрачности. 20:03 Поддержка промежуточных переходов • Поддержка промежуточных переходов при открытии и закрытии окна. • Возможность закрытия окна на полпути открытия. 20:11 Следующий шаг • Добавление контента внутри элемента управления. • Создание расширяемого и сворачиваемого элемента управления. • Настройка переменной ширины и высоты всплывающих окон.00:00 Исправление ошибок меню • Меню не работает, нужно исправить ошибку. • Уменьшить размер заголовков и разместить меню так, чтобы оно выглядело как другое меню. • Выяснить причину сбоя при переплете. 01:00 Настройка открытия меню • Сделать меню открытым по умолчанию. • Установить значение «список открыт» равным true для постоянного отображения меню в модели просмотра. 02:10 Работа с диспетчером • Добавить диспетчер для безопасного изменения пользовательского интерфейса. • Переместить сетку и базовый элемент управления в поток диспетчера. • Убедиться, что анимационная галочка остаётся в потоке пользовательского интерфейса. 04:11 Стилизация интерфейса • Стилизовать интерфейс для соответствия измерителю громкости Julian. • Изменить заголовок, сделав его тонким и красивым. • Изучить шаблон управления для расширителя. 08:20 Работа с темами управления • Использовать темы управления как ресурсы для стилизации. • Создать новый шаблон управления для маленького расширителя. • Применить тему управления к настоящему расширителю. 11:30 Настройка кнопки переключения • Сделать фон кнопки переключения прозрачным. • Скопировать шаблон исходной кнопки переключения и добавить его к своей кнопке. • Переместить стрелку на правую сторону кнопки. 12:59 Завершение настройки • Убрать отступы над стрелкой. • Сделать стрелку на всю высоту. • Добавить содержимое обратно в заголовок, убедившись, что он свернут как можно тоньше. 13:41 Удаление синей рамки и замена презентатора контента • Удаление синей рамки связано с классом Expander CS, который читает название и применяет шаблон. • Замена презентатора контента на элемент управления контентом, чтобы лишить Expander возможности управлять шаблоном. 14:27 Перемещение содержимого • Перемещение содержимого вверх по порядку для правильного отображения. 14:35 Создание стрелки с помощью потоковой геометрии • Объяснение синтаксиса пути и команд для создания стрелки: «м» открывает путь, «l» создаёт линейную команду, «v» — вертикальную линию, «c» — кривую. • Пример создания стрелки с перемещением на ноль, затем на одну и другую линию, и выполнением команды «Закрыть». 16:03 Настройка обводки и завершение фигуры • Изменение обводки фильтра для отображения контура стрелки. • Удаление команды «z» для незавершённой фигуры. 16:54 Перерисовка стрелки • Перерисовка стрелки с нуля, начиная с перемещения курсора на 12 градусов вправо. • Корректировка углов для устранения лишнего пространства. 18:55 Добавление линии границы • Вставка панели стека и добавление прямоугольника для заливки в нижней части расширителей. • Настройка высоты прямоугольника и отступов для соответствия оригиналу. 20:22 Стилизация кнопок и заголовков • Стилизация кнопок и заголовков, добавление эффектов наведения курсора. 20:55 Вращение стрелки • Использование рендеринг-трансформации для вращения стрелки при расширении и сжатии. • Привязка к свойству toggle buttons is checked и создание конвертера значений для преобразования логического значения в рендеринг-трансформацию. 22:09 Реализация конвертера значений • Создание класса checked to rotation converter для преобразования логического значения в угол в градусах. • Обработка недопустимых значений и возврат уведомления о привязке. 24:10 Завершение работы • Добавление ресурса преобразователя значений в пользовательский элемент управления. • Проверка работы стрелки, которая вращается в зависимости от состояния элемента управления. • Подведение итогов и завершение занятия.00:00 Создание модели основного представления • Создание модели основного представления с сгруппированной коллекцией в раскрывающемся списке. • Переход к XAML-файлу главного окна и редактирование расширителя для более широкого обзора. • Использование границы всплывающего окна и коллекции из коллекции для организации данных. 00:56 Привязка элемента управления • Привязка элемента управления first items к списку конфигураций каналов. • Создание шаблона элемента управления items для указания внешнего вида каждого элемента. 01:29 Настройка пользовательского интерфейса • Настройка шаблона данных для динамического отображения элементов. • Привязка метки к ключу IEnumerable конфигураций каналов. 02:39 Работа с расширителем • Вставка расширителя обратно в XAML-файл. • Добавление сетки и метки ключа для организации элементов. 03:56 Привязка содержимого выпадающего списка • Добавление элемента управления items и настройка его шаблона. • Проверка работы привязки и автоматическое отображение элементов. 05:14 Преобразование элементов в кнопки • Замена меток на кнопки для обработки нажатий. • Привязка кнопок к команде для выполнения действий. 06:42 Передача родительского элемента • Передача родительского элемента дочернему через viewmodel. • Использование инструментария MVVM для определения нажатого элемента. 07:11 Привязка к команде • Привязка кнопки к команде с передачей элемента конфигурации канала. • Проверка работы команды через точку останова в viewmodel. 10:59 Завершение привязки • Настройка выбранной конфигурации при нажатии кнопки. • Привязка анимированных всплывающих окон к открытым спискам настроек канала. 11:42 Проверка состояния списка • Проверка открытия списка настроек канала через привязку к его состоянию. 12:07 Проблема с привязкой • Значение переменной не меняется при открытии меню. • Привязка к кнопке и тексту работает, но всплывающее меню не функционирует. 12:53 Анализ проблемы • Проблема связана с анимированным всплывающим окном и односторонней привязкой. • Необходимо изменить привязку на двустороннюю. 13:54 Решение проблемы с рендерингом • Рендеринг запускает бесконечный цикл из-за изменений в пользовательском интерфейсе. • Переопределение рендеринга в модели представления и анимированном всплывающем окне. • Передача изменений в другой поток диспетчера для предотвращения бесконечного цикла. 15:09 Проверка работы привязки • Двусторонняя привязка работает при открытии меню, но не при закрытии. • Ошибка может быть в анимированном всплывающем окне. 16:13 Анализ работы анимации • При закрытии меню запускается анимация обновления, но значение «открыто» остаётся истинным. • Удаление анимации из вызовов «начать открывать» и «закрыть». 17:07 Завершение работы • Обновление анимации и вызов события изменения свойства. • Кнопка теперь закрывает меню правильно. 18:06 Привязка к тексту • Содержимое привязано к тексту кнопки настройки канала, который привязан к короткому тексту выбранных каналов. • Планируется форматирование сетки для улучшения внешнего вида. • Самая сложная привязка решена, остальные будут проще.00:00 Введение в viewmodels и сервисы • Объяснение необходимости использования viewmodels, сервисов и привязок. • Создание viewmodel для меню с сгруппированным контентом. • Модель представления должна содержать строку для отображения и быть связана с выбором в раскрывающемся списке. 00:58 Разделение обязанностей с помощью сервисов • Viewmodels не должны собирать информацию, это задача сервисов. • Создание папки «службы» и монолитного сервиса «i audio интерфейсная служба». • Сервис будет обрабатывать получение данных, необходимых для приложения. 01:57 Реализация метода получения конфигураций каналов • Определение метода «get channel configuration» для получения списка конфигураций каналов. • Метод будет асинхронным, возможно, извлекающим данные из базы данных. 02:49 Создание элемента конфигурации канала • Создание папки «модели данных» и элемента «channel configuration item». • Элемент должен быть неизменяемым для предотвращения изменений информации. 03:52 Решение проблемы с компилятором • Описание ошибки в Rider при использовании ключевого слова `cp nines init`. • Временное решение проблемы путём добавления внешнего класса. 07:23 Использование record для неизменяемых объектов • Объяснение использования record для создания неизменяемых классов. • Record позволяет эффективно компилировать классы со свойствами, доступными только для чтения. 09:13 Создание фиктивного сервиса аудио-интерфейса • Создание фиктивного сервиса аудио-интерфейса для разработки пользовательского интерфейса. • Возможность замены фиктивного сервиса реальным при запуске приложения. 10:11 Имитация данных конфигурации канала • Создание нового элемента конфигурации канала с группой, текстом и коротким текстом. • Пример имитации данных: группа «моно-стерео», длинный текст и короткий текст. • Использование строчных букв для групп и заглавных для пользовательского интерфейса. 11:37 Введение в проект • Обсуждение фиктивной информации и группировки данных по строке group. • Планирование внедрения сервиса в viewmodel. • Объяснение работы общедоступных свойств через observable. 12:39 Конструктор и внедрение зависимостей • Создание конструктора для внедрения службы аудио-интерфейса. • Определение частных свойств для хранения зависимостей. • Пример инициализации зависимостей в разделе «Инициализация фреймворка». 15:31 Проблемы с конструктором по умолчанию • Проблема отсутствия конструктора по умолчанию и её решение путём создания дополнительного конструктора. • Замена двух экземпляров для корректной работы приложения. • Проверка работы конструктора в режиме разработки. 17:41 Получение списка конфигураций • Использование observable сгруппированной коллекции для работы со списком конфигураций. • Формирование групп по заголовкам и элементам конфигурации. • Инициализация данных асинхронно при готовности приложения. 19:12 Именование свойств и предупреждения • Решение проблем с предупреждениями о неправильном именовании свойств. • Применение подчёркивания для наблюдаемых свойств. • Устранение предупреждений о несоответствии правилам именования. 20:10 Выбор и отображение выбранного элемента • Сохранение выбранного элемента и получение текста для кнопки. • Создание наблюдаемого свойства для выбранного элемента. • Обновление пользовательского интерфейса при изменении выбранного элемента. 22:45 Команда для выбора элемента • Определение команды для обработки нажатия на элемент. • Запуск события уведомления при изменении выбранного канала. • Обновление пользовательского интерфейса при выборе элемента. 23:24 Обработка нажатия пункта меню • Ввод пункта из пользовательского интерфейса. • Обновление выбранного элемента. • Закрытие меню при изменении свойства «открыто». • Обновление кнопки с учётом выбранного элемента. 24:16 Добавление команды «ретранслировать» • Превращение команды в реальную команду. 24:24 Загрузка информации • Использование общедоступных методов для загрузки информации. • Преобразование методов в команды для асинхронной ретрансляции. 25:34 Преобразование макета • Преобразование макета в наблюдаемую сгруппированную коллекцию. • Группировка конфигураций каналов по элементу и свойствам. 26:30 Запуск загрузки настроек • Запуск загрузки настроек при загрузке представления. • Инициализация контекста данных и команды «Загрузить настройки». 27:34 Привязка текста кнопок • Привязка текста кнопок к выбранному свойству. • Отображение сообщения «выбрать канал». 28:32 Ошибка с нулевой ссылкой • Возникновение исключения с нулевой ссылкой. • Проверка контекста данных и команды «Загрузить настройки». 29:37 Исправление ошибки • Завершение инициализации фреймворка. • Проверка жизненного цикла приложения. 30:20 Проверка контекста данных • Проверка заполнения контекста данных информацией. • Исправление неправильно сгруппированных данных. 31:39 Обновление приложения • Обработка внедрения зависимостей. • Привязка списка к пользовательскому интерфейсу. • Заполнение интерфейса реальными данными. 32:20 Заключение