background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Android - View в Android"

input logo icon
Теги видео
|

Теги видео

android
view
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
[музыка]
00:00:08
Всем привет У нас сегодня вторая лекция
00:00:11
из курса школы мобильной разработки
00:00:12
сегодня с вами в онлайне студенты школы
00:00:15
мобильной разработки Ольга слушатели из
00:00:17
Яндекса и слушатели открытого лектория и
00:00:20
сегодня мы с вами поговорим про
00:00:21
интерфейсную часть Android приложений И
00:00:23
в частности proview меня зовут Даниил я
00:00:26
буду вести лекцию Я разработчик Android
00:00:28
приложение сейчас занимаюсь разработкой
00:00:31
клиентского приложения яндекс.гол по
00:00:33
ходу лекции вас возможно будут вопросы
00:00:35
вы их можете смело задавать Ваха слайдс
00:00:37
ссылка будет в чате трансляции вопросы
00:00:40
кстати можно не только задавать но и
00:00:42
лайкать
00:00:43
цели нашей лекции будет являться
00:00:45
систематизация знаний по реализации
00:00:47
интерфейсного слоя приложений по итогам
00:00:50
лекции мы разберем
00:00:51
составляющую интерфейсного слоя и
00:00:53
научимся создавать интерфейс приложения
00:00:57
по плану лекции у нас будет 5 блоков
00:00:58
начнем с View далее будет группы
00:01:02
жизненный цикл View tochi и residerview
00:01:05
и буквально пару слов про формат лекции
00:01:08
лекция будет состоять Как из теории
00:01:11
такие практики на практике мы рассмотрим
00:01:13
две задачи мы будем отталкиваться от
00:01:16
реальных задач и на их примере
00:01:17
знакомиться с теорией также после каждой
00:01:20
секции нас будут
00:01:22
пара минут на вопросы которые постараюсь
00:01:24
ответить
00:01:26
надеюсь нас будет отлично
00:01:29
Ну что давайте начнем И начнем мы с
00:01:32
определения интерфейсного слоя
00:01:34
приложения интерфейс приложения это все
00:01:36
то что видит и с чем взаимодействует
00:01:37
пользователь приложения Также можно
00:01:40
сказать что это состояние приложения на
00:01:41
уровне слоя данных к задачам интерфейса
00:01:45
приложения можно отнести отображение
00:01:47
данных для пользователя то есть
00:01:48
информацию которую мы хотим предоставить
00:01:50
и получение информации от пользователя
00:01:52
то есть с помощью кликов с помощью ввода
00:01:54
информации свайпов и других жестов на
00:01:58
примере видео справа на слайде можно
00:02:00
увидеть что
00:02:01
нас пользователь Яндекс пытается
00:02:04
заказать такси соответственно Мы
00:02:06
предоставляем ему информацию о статусе
00:02:07
заказа и
00:02:10
о водителя о цене поездки то есть эта
00:02:14
информация которую мы предоставляем с
00:02:16
помощью нашего интерфейса А вот
00:02:18
пользователям мы получаем информацию о
00:02:20
том откуда и куда он поедет и получаем
00:02:24
информацию о том что он хочет заказать
00:02:26
такси
00:02:27
наш интерфейс также стоит упомянуть что
00:02:30
состоит из виджетов то есть уже и
00:02:32
знакомых нам View
00:02:34
Ну что начнем с некоторого описания View
00:02:36
это строительный блок для компонентов
00:02:39
интерфейса это все то что вы видите на
00:02:41
экране и без View у нас бы не получилось
00:02:43
бы ничего отобразить То есть это любой
00:02:45
текст любая картинка это все View также
00:02:48
View это абстрактный класс И стандартной
00:02:50
библиотеки Android это нектора пик
00:02:52
которая предоставляет нам разработчики
00:02:53
Андроида
00:02:54
также View Это больше чем это больше 30
00:02:59
тысяч строк кода задача View можно
00:03:01
отнести отображение данных и обработку
00:03:03
событий от пользователя
00:03:06
и тут еще буквально пару слов скажем о
00:03:09
том Почему в 23 году все еще изучаем
00:03:12
View any compose View это все-таки
00:03:14
фундаментальная вещь которая
00:03:17
незнание которое достаточно критично для
00:03:19
Android разработчиков у нас все еще
00:03:21
большинство проектов написано View не
00:03:24
все проекты полностью переехали на
00:03:26
котлин то есть некоторых проектов еще
00:03:27
остаются остается код на Java как мы
00:03:30
знаем пророк
00:03:31
комфосли фреймворк плюс у нас есть
00:03:35
различия в навигации у нас полностью
00:03:37
меняется парадигмы построение навигации
00:03:39
в приложении если раньше мы меняли
00:03:42
экраны с помощью фрагментов то сейчас в
00:03:45
компоузе мы это делаем с помощью
00:03:48
и у нас также есть различия в жизненном
00:03:50
цикле
00:03:52
наша первая секция с вопросами буквально
00:03:54
минута Можете писать в чат будем
00:03:57
отвечать
00:04:15
Ну кажется у нас вопросов Пока нет
00:04:18
Думаю все отлично и Давайте перейдем к
00:04:22
основной части нашей лекции начнем мы
00:04:24
сразу с постановки задачи нам нужно
00:04:26
отрисовать следующий экран достаточно
00:04:28
простой и стандартный экран авторизации
00:04:30
и перед написанием кода Мы можем для
00:04:34
начала импозировать задачу мы можем
00:04:37
посмотреть на то из чего состоит наш
00:04:40
дизайн экрана у нас есть Back Button
00:04:44
который изображен в виде картинки У нас
00:04:47
есть заголовок и подсказки которые
00:04:50
представляют собой представляют из себя
00:04:52
текст есть поле ввода есть кнопка
00:04:55
и тут есть небольшое предисловие View
00:04:58
Это не единственный компонент который
00:04:59
нам предоставляют разработчики Андроида
00:05:01
у нас есть целая библиотеки с наиболее
00:05:04
часто используемыми компонентами
00:05:06
и вот начнем с первой библиотеки со
00:05:10
стандартной библиотеки Андроидом
00:05:12
разработчики Андроида добавили в неё
00:05:14
дефолтные View без стилей которые мы
00:05:17
можем уже использовать как готовые в
00:05:18
вихи мы можем их расширять
00:05:20
модифицировать
00:05:21
Сюда можно отнести текст View Button
00:05:24
editext
00:05:26
и Эта библиотека у нас подключается
00:05:29
сразу из коробки то есть ее не нужно
00:05:31
подключать отдельной зависимостью
00:05:34
вот здесь у нас представлено достаточно
00:05:36
объемная иерархия вьюн и стандартные
00:05:39
библиотеки Андроида Ну наверное это по
00:05:41
большей части все виды юг которые нам
00:05:44
предоставляются в качестве API от
00:05:47
разработчиков
00:05:48
здесь добавил иерархию поменьше здесь
00:05:51
уже представлены которые мы чаще всего
00:05:53
используем в работе Вот слева не
00:05:55
отмечены это текст you Button editex
00:05:59
Box Switch и Progress Bar
00:06:02
также есть библиотека которая служит для
00:06:05
поддержки функционала добавлено более
00:06:07
новых версиях Андроида для его поддержки
00:06:10
на старых версиях платформы название
00:06:13
библиотеки от compad И она из коробки не
00:06:17
предоставляется то есть ее нужно
00:06:18
подключать отдельной зависимостью
00:06:21
также есть готовые стилизованные вьюхио
00:06:24
от Гугла Они находятся в библиотеке
00:06:26
материал дизайн может возникнуть Хороший
00:06:29
вопрос почему добавили еще одну
00:06:31
библиотеку Зачем нам столько много
00:06:34
это попытка говоря про материал дизайн
00:06:37
это попытка привести все компоненты к
00:06:39
единому стилю на Андроиде то есть как-то
00:06:41
унифицировать
00:06:43
интерфейс Android приложений
00:06:45
и еще небольшой факт что материал дизайн
00:06:48
под капотом использует библиотеку Up
00:06:50
compat
00:06:52
Давайте вернемся к нашей задаче начнем
00:06:55
мы с отрисовки заголовка на экране это
00:06:58
обычный текст и взглянув на иерархию
00:07:01
поменьше У нас есть такой компонент как
00:07:03
textview и по названию вроде достаточно
00:07:05
очевидно что это View который отображает
00:07:08
текст на экране
00:07:10
так Ну хорошо мы с компонентом
00:07:12
определились и Давайте определимся Как
00:07:15
нам добавить VIN на экран как на неё
00:07:16
отобразить пользователю сделать это
00:07:19
можно двумя способами через язык
00:07:21
разметки xml и программно
00:07:24
xml это язык разметки где мы через теги
00:07:27
задаем объекты и с помощью атрибутов Мы
00:07:30
также задаем свойства этим объектам
00:07:32
можно здесь привести сравнение
00:07:35
совмещенным HTML и CSS
00:07:38
и Давайте попытаемся получить Наш первый
00:07:40
результат отобразить наш заголовок на
00:07:42
экране В данном случае мы файле Activity
00:07:45
main.xml определяем тег текст View и
00:07:48
задаем некоторые атрибуты видео ID
00:07:50
высоты ширины и дальше в методе oncreate
00:07:54
класса mainactivity мы находим View с
00:07:57
помощью метода findview BYD и с этим
00:08:00
есть свойство текст и получаем
00:08:02
соответствующий результат как на
00:08:03
фотографии справа
00:08:06
здесь на код можно особо не смотреть мы
00:08:08
его разбирать не будем просто хотелось
00:08:10
показать что такую живью такой же
00:08:13
заголовок мы могли отобразить с помощью
00:08:15
котлин кода то есть программным для
00:08:18
этого мы создаем объект рамсов создаем
00:08:21
объект textview далее с этим некоторые
00:08:24
свойства для тех здаю и добавляем в юный
00:08:27
кран с помощью
00:08:30
в целом У нас появился экран у нас
00:08:33
появился заголовок на экране Но кажется
00:08:35
он отличается от нашего первоначального
00:08:37
дизайна Давайте разбираться чего не
00:08:39
хватает
00:08:41
как мы сказали ранее xml это язык
00:08:43
разметки где через теги задаются объекты
00:08:46
А через атрибуты создаются свойства
00:08:48
объектом
00:08:49
У нас есть пространство атрибутов
00:08:51
Android в котором уже есть различные
00:08:53
модификации
00:08:54
наших Как видно на фрагменте кода мы
00:08:59
добавили несколько атрибутов и получили
00:09:01
соответствующий результат на фотографии
00:09:03
справа который достаточно близок
00:09:07
и Начнем с того что начнем рассмотрение
00:09:10
этих атрибутов и Начнем с того что у нас
00:09:12
атрибуты делятся на две группы первая
00:09:15
группа она влияет непосредственно на
00:09:17
отображение View И вот она сейчас
00:09:20
отображена на экране более ярким
00:09:22
выделена на экране более ярким цветом
00:09:25
вторая группа влияет на отображение View
00:09:27
внутри родительского контейнера Сюда
00:09:29
можно отнести
00:09:30
атрибуты размерности
00:09:32
внешний отступы также позиционирование
00:09:36
и давайте начнем рассмотрение с первой
00:09:39
группы атрибутов И в частности с ID мы
00:09:42
его уже затрагивали
00:09:44
слайдами ранее еще раз пройдемся по
00:09:47
этому атрибуту А идея это уникальное
00:09:50
значение для View в текущем xml файле
00:09:52
для его идентификации Для чего Нам нужен
00:09:56
он нам нужен для того чтобы мы через код
00:09:58
смогли обратиться к этой View и задать
00:10:03
ей некоторые свойства для
00:10:05
динамического изменения представления
00:10:09
атрибуты которые мы добавили к заголовку
00:10:11
это текст Color Texas и Text Style то
00:10:16
есть благодаря этим атрибутам у нас наш
00:10:18
заголовок стал похож на заголовок с
00:10:21
дизайном
00:10:22
по названию здесь достаточно очевидно
00:10:24
что текст отвечает за текст который мы
00:10:27
видим на экране текст скалы за цвет
00:10:29
текста текст сайт за размер текста и
00:10:32
текст ставил за стиль текста
00:10:36
давайте рассмотрим Еще парочку других
00:10:38
часто используемых атрибутов можно
00:10:41
начать физиобилити атрибут избилити
00:10:44
может принимать три типа значений это
00:10:47
visible Invisible Gun может возникнуть
00:10:50
Хороший вопрос Чем отличаются значения
00:10:53
Invisible Gun если Мы отмечаем
00:10:57
убью везде билете типа Invisible то View
00:11:00
не видна пользователю но она Занимает
00:11:03
место на экране Ганжа в свою очередь не
00:11:06
Занимает место на экране
00:11:08
перейдем к следующему атрибутам это
00:11:10
Gravity и layout Гравити Гравити он
00:11:14
отвечает за отображение контента внутри
00:11:16
View я вот Гравити за отображение View
00:11:19
внутри своего контейнера и можно
00:11:22
рассмотреть небольшой пример у нас есть
00:11:25
экран с тремя текст задержками
00:11:29
эти квадраты это все еще текст просто
00:11:32
заданными высотой шириной и у Красного
00:11:34
квадрата мы отметили Гравити топ Что
00:11:37
означает что контент Наш текст даю а
00:11:40
Контент textview это сам текст Он
00:11:42
располагается верхней границы
00:11:44
соответственно зеленого квадрата мы
00:11:46
отметили
00:11:47
Гравити баттом и текст располагается в
00:11:51
Нижней грани
00:11:53
желтый для желтого квадрата для объекта
00:11:56
желтого квадрата мы задали
00:11:59
и соответственно этот квадрат появился с
00:12:02
правой стороны экрана
00:12:05
и поговорим еще немного про расположение
00:12:07
View на нашем экране для начала хочется
00:12:11
Уточнить что любое View это
00:12:13
прямоугольник наверное с виду это не
00:12:16
всегда кажется правдой например при
00:12:17
работе с текстом но как можно было
00:12:20
заметить на предыдущем слайде даже текст
00:12:22
обладает прямоугольным бэкграундом также
00:12:25
говоря про координатную сетку
00:12:27
координатная сетка в Андроиде берет свое
00:12:29
начало в левом верхнем углу начинается
00:12:31
от нуля и идет слева направо для оси X И
00:12:36
сверху вниз для оси Y
00:12:39
также у каждого есть такие координаты
00:12:41
как Left Top Right Button и Start
00:12:45
их представление можно увидеть на
00:12:47
фотографии справа на слайде давайте
00:12:49
рассмотрим как у нас высчитывается За
00:12:51
что отвечает значение Left Left это
00:12:54
координата по оси X для левой грани
00:12:58
нашей View ну и соответственно другие
00:13:01
Стороны также высчитываются
00:13:04
есть еще такие свойства
00:13:09
Y которые используются для анимации
00:13:11
передвижения объекта они просто говорят
00:13:14
они задают конечные точки куда должна
00:13:16
встать пока она не встанет на это место
00:13:19
она анимируется ассимилируются плавный
00:13:21
переход
00:13:23
а также у View есть такие координаты как
00:13:27
X Y
00:13:28
формулы Вы можете сейчас увидеть на
00:13:30
экране
00:13:31
по сути X и Y это координаты левого
00:13:35
верхнего угла View
00:13:38
и Пару слов про размерность виджетов
00:13:40
любой виджет должен обладать высотой и
00:13:44
шириной для определения ширины мы
00:13:47
применяем форму райт минус Left для
00:13:50
определения высоты мы применяем формулу
00:13:52
bata - стоп
00:13:55
еще убью есть такие параметры как и
00:13:59
magics они отвечают тоже за высоту и
00:14:03
ширину но они отвечают уже за реальную
00:14:04
высоту то есть людей которые мы задали
00:14:06
как разработчики эти значения обычно
00:14:11
совпадают и но некоторых случаях
00:14:15
некоторых кейсах они могут все-таки
00:14:16
отличаться о них мы поговорим немного
00:14:18
позже
00:14:19
также есть
00:14:21
параметры паддинга и марджана которые
00:14:24
отвечают за отступы сейчас мы рассмотрим
00:14:27
подробнее чтобы понять что такое марджан
00:14:30
Давайте посмотрим на фотографию с правым
00:14:32
можно заметить что при добавлении
00:14:34
атрибутов
00:14:36
некоторым значением у нас вся View
00:14:39
сдвинулась на некоторое значение вправо
00:14:42
то есть и текст и background
00:14:45
То есть это маржин это внешний отступ
00:14:49
[музыка]
00:14:51
падинг же в свою очередь это внутренний
00:14:54
отступ для контента View и на фото можно
00:14:56
увидеть что теперь отодвинулся именно
00:14:58
текст внутри прямоугольника сам
00:14:59
прямоугольник то есть background остался
00:15:01
на месте
00:15:04
следующая тема которой хочется
00:15:06
поговорить Это rtl rtl это зеркальное
00:15:10
отображение нашего экрана условно Левое
00:15:13
и право на каждом смартфоне Но одно но
00:15:15
начало отображения элементов может
00:15:17
отличаться в зависимости от языка это
00:15:20
свойственно рабскому персидскому и
00:15:23
другим языкам из этой группы Поэтому в
00:15:27
Андроиде ввели поддержку rtl с 17 API и
00:15:32
ввели специальные атрибуты которые
00:15:33
полностью соответствуют тем в которые
00:15:36
были слова lefter Ride То есть у нас
00:15:38
было margin Left теперь у нас появился
00:15:40
magen Старт у нас был паддинг райт
00:15:42
появился паддинг and Ну также со
00:15:44
значением Left Right нас появились
00:15:47
значения Start and
00:15:50
и тут мы плавно переходим ко второй
00:15:52
группе вторая группа относится к рамсом
00:15:56
это некоторые даты класс которые хранят
00:15:58
данные о том как располагать внутри
00:16:00
своего контейнера
00:16:01
основными атрибутами относящимися к этой
00:16:04
группе являются атрибуты размерности то
00:16:07
есть
00:16:09
также атрибуты отступов позиционирование
00:16:12
и другие специальные атрибуты
00:16:16
Вот и давайте начнем рассмотрение с
00:16:19
атрибутом высоты и ширины это has они
00:16:24
могут принимать следующие значения
00:16:26
которые сейчас отображены на слайде У
00:16:29
нас есть специальное значение Match
00:16:30
parent которое говорит о том что View
00:16:32
занимает все пространство родителя также
00:16:35
у нас есть значение
00:16:37
Rap conten которое говорит нам о том что
00:16:39
бью занимает только необходимое для
00:16:42
отображения пространства
00:16:44
мы можем также задать размерность
00:16:46
пикселях в дэнсити пикселях в Skill и на
00:16:51
пикселях и есть у нас еще специальное
00:16:53
значение 0 дипик которое говорит нам о
00:16:55
том что занимает либо нулевое
00:16:57
пространство либо у нас есть
00:17:00
альтернативные способы задания
00:17:02
размерности в частности это уэйд то есть
00:17:05
с помощью весов которых мы поговорим
00:17:06
немножко позже
00:17:09
Давайте попытаемся сейчас отрисовать
00:17:11
кнопку назад из нашего
00:17:14
на нашем экране для этого мы можем
00:17:16
использовать соответствующий элемент
00:17:18
imageview
00:17:19
задав значение для высоты ширины в 20dp
00:17:23
но
00:17:25
результаты на экране Сейчас нет Потому
00:17:28
что потому что мы не задали источник для
00:17:30
картинки для этого мы можем определить
00:17:33
атрибут Source src и передать значение
00:17:38
дать ссылочку на drawble File и также
00:17:42
задать некоторые значения остров маржин
00:17:44
старт и маржин доп по итогам мы получаем
00:17:46
наш
00:17:50
для подсказки с текстом email также
00:17:53
используем текст добавляем некоторые
00:17:56
стили с помощью атрибутов и выставляем
00:17:58
маржин топ 142 DP Вы можете еще заметить
00:18:02
что у нас с добавлением каждой
00:18:05
будет увеличиваться значение маржин топа
00:18:08
то есть мы как бы отталкиваемся от
00:18:09
верхней грани нашего интерфейса чтобы
00:18:12
расположить View в правильном порядке
00:18:16
для ввода e-mail мы используем элементы
00:18:18
текст также задаем стандартные атрибуты
00:18:21
и добавляем маржин топ который можно
00:18:23
заметить что увеличился
00:18:25
а
00:18:27
[музыка]
00:18:28
далее
00:18:30
можно заметить что у нас появился
00:18:34
новый атрибут background
00:18:37
background это атрибут который задает
00:18:39
цвет для фона View но здесь можно
00:18:42
разглядеть что у нас задается не цвет а
00:18:45
какой-то дрова пол Я думаю мы поговорим
00:18:48
об этом в Advance секции в одной из
00:18:51
следующих лекций но сейчас можно
00:18:53
представлять себе что способ задания
00:18:54
background с помощью дроуда был файла
00:18:56
это
00:18:57
способ задать только цвет нашему фону но
00:19:02
и форму То есть у нас как можно здесь
00:19:05
увидеть на примере
00:19:07
задается не только цвет с помощью тега
00:19:10
Solid но и
00:19:12
радиус углов с помощью тега корнерс 12dp
00:19:19
также используем текст для подсказки
00:19:22
которые находятся под полем воды email и
00:19:25
также представляем маржин топ который
00:19:26
уже равняется 19 пи
00:19:29
далее Нам необходимо отрисовать кнопку
00:19:32
для этого мы можем использовать такой
00:19:34
компонент как Button мы задаем
00:19:38
тоже атрибуты texcolor текст задаем
00:19:42
отступы и здесь у нас бэкграунд тоже
00:19:46
проставлен с помощью drawl файлом
00:19:49
Как можно увидеть у нас кнопка далее Это
00:19:53
не прямоугольник это такой прямоугольник
00:19:56
закругленными углами Вот И для этого мы
00:19:58
также используем dropbal File где
00:20:00
обозначаем
00:20:01
радиус углов 42 DP
00:20:07
для подсказки под кнопкой все также
00:20:10
используем объект textview и здесь можно
00:20:14
заметить что у нас начинаются некоторые
00:20:16
проблемы при отображении подсказки у нас
00:20:19
не хватает места для
00:20:20
проставления отступов между кнопкой и
00:20:23
текстом и между нижней гранью интерфейса
00:20:26
и подсказки
00:20:29
Ну вроде на нашем телефоне все было
00:20:32
достаточно хорошо за исключением пары
00:20:35
моментов Но если включить наш код на
00:20:39
других девайсах например на планшете с
00:20:42
диагональю 994 дюйма то можно заметить
00:20:44
существенное различия
00:20:46
Если же включить на
00:20:48
устройстве с диагональю 3.2 дюйма то у
00:20:53
нас совсем пропадает кнопка далее без
00:20:55
которой мы наверное даже не сможем
00:20:56
авторизоваться в приложении
00:20:59
и Давайте поговорим про проблемы В
00:21:03
текущей реализации
00:21:04
можно заметить что для позиционирования
00:21:07
в юноэкране мы как бы отталкивались от
00:21:10
верхнего края нашего девайса с
00:21:13
использованием то есть мы использовали
00:21:14
маржин топы как бы отталкиваясь от
00:21:16
проставляя отступы при использовании
00:21:19
маржин топов у нас уже начали появляться
00:21:22
проблемы Даже на нашем устройстве когда
00:21:24
мы попытались отобразить подсказку под
00:21:26
кнопкой
00:21:28
также нас могут возникать проблемы при
00:21:32
добавлении нового элемента на экран нам
00:21:35
придется редактировать
00:21:36
все объекты которые уже были определены
00:21:39
на экране
00:21:42
плюсом ко всему у нас могут быть разные
00:21:44
размеры устройств нас могут быть часы у
00:21:47
нас могут быть планшеты у нас могут быть
00:21:49
телефоны с диагональю 5 дюймов могут
00:21:52
быть диагональю 32 дюйма поэтому
00:21:56
[музыка]
00:21:58
значение
00:22:00
в маржанах это достаточно плохой пример
00:22:04
позиционирования на экране
00:22:06
плюсом ко всему у нас нет структурного
00:22:09
подхода при расположении на экране Вот
00:22:12
для этого у нас используется v-группы
00:22:15
которых мы поговорим в следующей секции
00:22:17
пока у нас вопросами можете задавать
00:22:21
кажется уже есть вопросы
00:22:29
я их пока немножко быстро изучу и
00:22:32
попытаюсь ответить на самые интересные
00:22:40
вопрос про скоро перестанут писать в
00:22:43
vixamily скорее Нет с нами вьюшки еще
00:22:47
надолго XL тоже надолго
00:22:51
кастом View делать не будем скорее всего
00:22:54
это будет в Advance секции
00:23:15
есть вопрос про важность регулирования
00:23:18
подсказок от Android студии
00:23:21
вопрос состоит в том
00:23:24
насколько часто нужно слушать
00:23:28
предупреждение Android студии о частично
00:23:30
перекрытие при определенных форматах
00:23:32
экрана
00:23:33
я честно говоря не смогу сейчас
00:23:35
прикинуть такой пример но могу сказать
00:23:39
точно Что
00:23:41
если появляются какие-то предупреждения
00:23:44
студии их нужно лечить если не
00:23:47
получается то должны быть веские
00:23:49
обоснования
00:23:53
Jetpack навигацию будем использовать в
00:23:55
домашках
00:23:57
наверное нет мы все-таки сейчас будем
00:24:01
домашнее задание Если не ошибаюсь писать
00:24:03
на
00:24:04
вьюшках поэтому
00:24:05
компост мы пока что оставим
00:24:09
пользуются ли еще линеру яутом еще все
00:24:12
еще пользуется
00:24:17
и был также вопрос про background teent
00:24:20
у кнопки это
00:24:24
способ определения цвета бэкграунда
00:24:27
когда мы задаем background с помощью
00:24:29
дров был файлом у нас немножко страдает
00:24:33
фон кнопки То есть у нас выставляется
00:24:36
нас не всегда выставляется верный фон
00:24:39
Поэтому в данном случае пришлось бы
00:24:42
пришлось добавить атрибут background
00:24:44
Teen Вы можете сами поэкспериментировать
00:24:46
с кодом он будет представлен дальше
00:24:50
[музыка]
00:24:56
так вопрос с навигацией был про
00:25:00
навигацию из набора
00:25:07
Вопрос немножко не понятен я думаю можно
00:25:11
будет написать мне в Telegram он будет в
00:25:14
конце лекции
00:25:15
постараюсь ответить
00:25:19
Так ну что давайте перейдем к следующей
00:25:21
секции
00:25:23
тут мы плавно переходим от вьюшек к
00:25:27
нашему группам Давайте поговорим про то
00:25:29
зачем нам нужны контейнеры для View
00:25:32
группы это особые View которые могут
00:25:35
хранить другие То есть дочерние View и
00:25:39
задачам View к задачам В группе будут
00:25:44
относиться будет относиться расположение
00:25:46
View в заданном порядке на экране в
00:25:49
Европе не только располагается в
00:25:51
каком-то порядке Но они их также
00:25:53
замеряют и пытаются расположить наиболее
00:25:55
корректным способом также в Европе
00:25:57
отвечают за диспетчеризацию касаний на
00:26:00
экране и являются базовым классом для
00:26:04
контейнеров то есть тоже некоторые от
00:26:06
разработчиков Android
00:26:08
здесь представлены основные группы это
00:26:17
сделаем небольшое отступление поговорим
00:26:19
про layout-файлы
00:26:21
Lead файлы это xml файлы которые
00:26:24
определяют интерфейс нашего приложения
00:26:26
либо его часть первый раз layout-файла
00:26:29
мы встречаемся при создании приложения с
00:26:31
пустым активити у нас появляется файл
00:26:33
Activity main.xml и тут возникает вопрос
00:26:37
В какой момент мы связываем наш xml-код
00:26:40
то есть наши объекты которые мы
00:26:42
определили в xml и наш котлин код какой
00:26:46
момент бьюхи из xml начинают появляться на
00:26:49
экране все это Начинает появляться
00:26:52
методом Create класса mainactivity
00:26:57
с помощью такого метода как сет
00:26:59
контен-вью Почему именно в методе on
00:27:02
Create Это происходит потому что этот
00:27:04
колбек отрабатывает практически на
00:27:05
старте приложения точнее на старте наши
00:27:09
Activity
00:27:10
метод отрабатывает до того как интерфейс
00:27:15
появится на экране
00:27:17
и второй момент файла которым Хотелось
00:27:20
бы поговорить Это
00:27:21
тот факт что нашел файлы должны иметь
00:27:26
только одну корневую то есть одну группу
00:27:29
или View первого уровня в иерархии
00:27:32
поэтому почти всегда мы начинаем
00:27:34
верстать с помощью групп чтобы была
00:27:38
возможность расположить и скомпоновать
00:27:41
объекты на экране
00:27:43
далее перейдем к подробному изучению
00:27:45
каждой каждого layoutin начнем с фрейму
00:27:49
яутом фрейму я вот это стек с дочерними
00:27:52
вьюшками которые накладываются друг на
00:27:54
друга и самый
00:27:57
фреймул считается самым легковесным
00:27:59
контейнером лиховесный в плане наименее
00:28:01
ресурсозатратный
00:28:04
плюсом ко всему можно отметить что у
00:28:07
дочерних элементов появится
00:28:09
атрибут layout Gravity который отвечает
00:28:11
за позиционирование элементов в этом
00:28:13
контейнере
00:28:14
говоря про применение фреймул яута можно
00:28:17
сказать можно выделить два кейса это
00:28:20
отрисовка простого экрана где у нас есть
00:28:23
одна или две вьюшки и управление
00:28:25
происходит с помощью атрибутов Гравити и
00:28:28
второй кейс применение
00:28:31
нескольких в одном месте то есть мы
00:28:35
скрываем одну View visibility и
00:28:38
показываем другую
00:28:40
также у нас есть такой Объект
00:28:45
который порядочивает своих детей
00:28:47
горизонтально в строку либо вертикально
00:28:50
в колонку для этого мы задаем линеру
00:28:53
яуту такой атрибут как rentation который
00:28:56
может принимать значения вертикал и
00:28:58
хризонту
00:29:00
также у линерал яута есть возможность
00:29:04
указать размерность дочерних элементов с
00:29:07
помощью весов то есть
00:29:09
относительном эквиваленте
00:29:12
говоря про применение
00:29:16
применение у линейного яута достаточно
00:29:18
простой это упорядочные элементов либо
00:29:20
горизонтально либо вертикально и
00:29:22
расположение элементов на экране без
00:29:25
знания их размерности то есть с
00:29:27
использованием весов о которых мы
00:29:29
поговорим далее
00:29:31
Вот ну как мы сказали
00:29:35
аута есть возможность работы с Весами
00:29:37
объектов например Чтобы отобразить экран
00:29:42
фотографии справа мы можем использовать
00:29:45
функционал
00:29:46
линерал Ялта для этого мы прописываем
00:29:49
наш тег линерал я вот и задаем
00:29:52
атрибут сумм равный четырём здесь сумма
00:29:56
здесь это значение равняется четырем
00:29:59
далее думаю вы поймете Почему именно 4
00:30:04
вот дальше внутри линерал я вот там
00:30:07
располагаем
00:30:08
дочерние View и проставляем ему я вот
00:30:11
уэйт соответствующий и можно заметить
00:30:15
что
00:30:16
layout with то есть ширина объекта
00:30:18
равняется нулю нулю с атрибутом DP то
00:30:24
есть 0 DP
00:30:25
говоря про цифру 4 Почему именно 4 можно
00:30:29
заметить что средняя View занимает
00:30:32
примерно половину экрана не считая
00:30:34
отступы соответственно она занимает 50
00:30:37
процентов экрана два из четырех это как
00:30:40
раз таки 50 процентов и соответственно
00:30:42
левая и правая бью занимают
00:30:46
половину
00:30:48
средней вьюшки соответственно они
00:30:50
занимают 1/4 и имеют соответствующий
00:30:53
соответствующее значение в атрибуте
00:30:55
равная единица
00:31:00
говоря вот он предназначался для
00:31:04
уменьшения вложенности при отрисовке
00:31:06
экрана и является устаревшей версией
00:31:09
констроента
00:31:10
это группа скорее осталась как Legacy и
00:31:14
рассматривать её подробно не имеет
00:31:17
смысла
00:31:18
теперь переходим к инструменту
00:31:20
constraint layout это наиболее гибкий
00:31:23
инструмент для позиционирования дочерних
00:31:25
View на экране из названия здесь следует
00:31:28
что constrain выставляет одну View
00:31:31
относительно другой То есть как бы
00:31:32
constraining одну к другой И вот на
00:31:35
фотографии справа на слайде можно
00:31:36
увидеть что наша View Con стремится
00:31:39
верхней гранью к нижней грани вьюшки а
00:31:42
управление
00:31:44
constrant происходит с помощью
00:31:45
соответствующих атрибутов которые
00:31:47
соответствуют парадигме
00:31:49
атрибуты которые отображен на экране это
00:31:51
constrain Top Tube томов там также есть
00:31:54
различные вариации constraint Button
00:31:56
Total of conster Ну и так далее
00:32:02
ступит нам доступен нам с 9p и
00:32:06
подключается отдельная библиотекой про
00:32:09
применение
00:32:11
концентри достаточно обширное применение
00:32:13
но можно выделить что этот группа нам
00:32:16
нужна для уменьшения влажности объектов
00:32:19
Так как при больших при большой
00:32:22
вложенности у нас может очень сильно
00:32:24
страдать
00:32:25
[музыка]
00:32:27
наш интерфейс то есть мы
00:32:30
очень сильно страдает производительность
00:32:32
нашего приложения
00:32:35
также constraint layout предоставляет
00:32:37
возможность делать так называемые
00:32:39
цепочки извьюшек с некоторым заданным
00:32:41
позиционированием
00:32:43
к этим стильным позиционирования можно
00:32:45
отнести
00:32:46
спредчи с preda Insight Wait packchain и
00:32:50
packchaint BIOS
00:32:52
применение цепочек показано сейчас на
00:32:54
слайде на фотографии по бокам у этих
00:32:58
цепочек можно представлять себе что
00:33:00
находится либо границы смартфона либо
00:33:03
другие
00:33:05
давайте рассмотрим каждую по отдельности
00:33:08
начнем точнее каждую цепочку По
00:33:10
отдельности начнем
00:33:14
он
00:33:16
Этот стиль при котором она Свободное
00:33:19
пространство распределяется равномерно
00:33:21
между элементами и краями
00:33:25
родителям сайт распределяет
00:33:29
свободные Свободное пространство между
00:33:31
элементами а
00:33:33
крайние элементы прижимаются родителя у
00:33:37
этой чей цепочка в которой мы задаем вес
00:33:39
нашим
00:33:42
нашим юшкам и патчейн это
00:33:47
цепочка в которой Свободное пространство
00:33:49
распределяется между крайними элементами
00:33:51
и границами родителя говоря Pro
00:33:54
packchain with BIOS цепочка расположение
00:33:58
которой мы выравниваем по оси с
00:34:00
использованием значения float которое
00:34:02
может быть от 0 до единицы
00:34:06
вот здесь представлены атрибуты которые
00:34:08
как раз таки отвечают за стилистику
00:34:11
цепочек в конценте
00:34:14
Вот и наконец-то возвращаясь к нашей
00:34:17
задаче Мы можем с уверенностью сказать
00:34:19
что мы выбираем constrant layout в
00:34:22
качестве корневой v-группы так как у нас
00:34:24
достаточно много элементов на экране и
00:34:26
элементы расположены как верхние так и в
00:34:29
нижней части экрана
00:34:30
плюсом к использованию constraint
00:34:33
является то что при добавлении нового
00:34:36
элемента на экран нам не придется менять
00:34:40
верстку Нам нужно будет внедрить просто
00:34:44
новые элементы с использованием constra
00:34:45
Intel
00:34:46
[музыка]
00:34:48
результат с использованием мы получили
00:34:51
следующие фотографии справа
00:34:53
код можно будет глянуть в githubby и
00:34:57
перейдя по ссылке либо по qr-коду и вот
00:35:00
здесь хочется разобрать небольшой
00:35:01
фрагмент кода с использованием
00:35:03
constraint lauta из нашего приложения
00:35:07
хочется показать как
00:35:11
встретились друг другу на примере
00:35:14
заголовка и на примере бэкбатана
00:35:19
бэкбаттена мы определили constrain
00:35:22
startu Start of parent и constrain Top
00:35:24
Top of pare то есть Мы
00:35:26
приезжали к верхней грани экрана и к
00:35:29
левой грани экрана
00:35:31
а текст View который отвечает за
00:35:34
заголовок
00:35:35
мы уже прижали не мы сделали
00:35:42
мы поставили отступ У нашего заголовка
00:35:47
не от верхнего края экрана А уже вот
00:35:50
Back Button и законостроение заголовок
00:35:53
Button с помощью
00:35:55
атрибута constrain Top Battle of
00:35:58
Давай соответствующие
00:36:02
соответственно это все про View группы
00:36:06
сейчас у нас снова секция с вопросами
00:36:10
если появились пишите будем отвечать
00:36:15
есть хороший вопрос про большую
00:36:18
влажность
00:36:19
это зло и почему в принципе Большая
00:36:23
влажность при использовании View это
00:36:26
плохо потому что у нас очень сильно
00:36:29
страдает производительность экрана то
00:36:30
есть нас
00:36:32
будут происходить постоянные перерисовки
00:36:35
экрана что достаточно трудно Поэтому нам
00:36:38
нужно избегать большой влажности с
00:36:40
помощью инструментов
00:36:44
Какой layout лучше использовать
00:36:46
constrant или линер Ну тут все зависит
00:36:49
от сложности
00:36:51
сложности вашего экрана
00:36:56
в плане производительности у них
00:36:59
различий нет есть только производитель
00:37:01
есть только различия в
00:37:02
производительности при использовании
00:37:03
линейного яута если мы используем
00:37:06
проставление размерности убью с помощью
00:37:09
весов то
00:37:11
там будет в два раза больше проходов по
00:37:15
жизненному циклу то есть по дереву View
00:37:17
об этом еще поговорим немного позже в
00:37:20
секции про жизненный цикл соответственно
00:37:24
Если вы не используете веса у линейного
00:37:27
Ялта то концентрики линеры они
00:37:29
соответствуют
00:37:31
ресурсы затратности если они вложены
00:37:34
никуда дальше
00:37:39
Как именно страдает производительность
00:37:41
при большой вложенности это долгий
00:37:43
партии из x-mail Нет это не долгий
00:37:46
парсинг из xml тут
00:37:48
проблема Начинает появляться когда мы
00:37:53
про эти проблемы мы можем подробнее
00:37:55
поговорить в секции про
00:37:59
жизненный цикл вьюшек у нас
00:38:03
каждая View проходит несколько этапов
00:38:06
до ее появления на экране
00:38:09
этап измерения этап расположения на
00:38:14
экране и эта отрисовки и соответственно
00:38:16
если у нас большая вложенность то у нас
00:38:18
эти этапы могут дублироваться и расти по
00:38:21
экспоненте
00:38:33
Какая вложено считается уже большой
00:38:35
Ну наверное если у Вас вложенность
00:38:40
от трех то это уже много кажется что
00:38:44
много
00:38:45
зависит от экрана если приложение очень
00:38:49
сложное то там могут быть
00:38:53
вложение 5 6 уровня
00:38:59
а также поступил вопрос про где про то
00:39:04
где можно посмотреть ресурсы затратность
00:39:05
яутинга мы об этом поговорим в следующей
00:39:08
секции про перформанс и дебаггинг у нас
00:39:11
есть специальные инструменты для этого в
00:39:14
этом можно будет
00:39:15
потом упомянуть
00:39:20
есть мнение что constraint имеет смысл
00:39:23
При количестве вложенных вьюг от 6 а
00:39:26
менее лучше использовать линер я вот ну
00:39:29
линейный layout не всегда дает
00:39:32
необходимый эффект так как
00:39:37
для того чтобы добиться
00:39:41
того же интерфейса с помощью линейного
00:39:44
яута нам потребуется Большая влажность
00:39:47
нас будет один я должен в другую другой
00:39:51
поэтому наверное
00:39:55
[музыка]
00:39:57
здесь немножко неверный с той стороны
00:40:00
что
00:40:05
нет какого-то определенного числа 6
00:40:08
все зависит от каждого интерфейса
00:40:11
индивидуально
00:40:13
Но если у вас просто идут элементы в ряд
00:40:17
либо в колонку я не
00:40:20
нужно задавать какую-то кастомную
00:40:22
кастомный констренько то наверное можно
00:40:25
использовать линер layout
00:40:42
Ну что я думаю можно переходить к
00:40:44
следующей секции
00:40:45
сейчас мы поговорим как раз про
00:40:48
жизненный цикл о котором мы уже
00:40:50
упоминали
00:40:51
жизненный цикл View начинается когда мы
00:40:54
вызываем метод adview для показа в ее на
00:40:57
экране может возникнуть вопрос Зачем нам
00:40:59
нужен
00:41:02
Есть некоторые этапы которые она
00:41:04
проходит до ее появления пользователю
00:41:06
или
00:41:07
во время отображения уже пользователь на
00:41:10
экране и разработчики платформы
00:41:12
предоставляют нам возможность управлять
00:41:14
этими стадиями отрисовки и layouting с
00:41:19
помощью специальных колбеков которые
00:41:20
сейчас у нас отображены на экране мы их
00:41:24
можем переопределять в кастомных брюках
00:41:27
и пытаться как-то манипулировать
00:41:29
расположением
00:41:30
измерением и дробингом
00:41:35
жизненный цикл делится на следующие
00:41:37
этапы на layout и троллинг layout свою
00:41:41
очередь делится на mazu Pass и
00:41:42
layoutpass
00:41:44
Давайте поговорим про каждый этап по
00:41:47
отдельности начнем с рассмотрения layout
00:41:50
layout этап отрисовки
00:41:53
layout этап включает в себя Major Pass
00:41:56
layoutpass
00:41:58
Major Pass отвечает за преобразование
00:42:01
различного рода значений по типу much
00:42:03
parent или Rap conten у размер у
00:42:06
размеров вьюшек в более понятные для
00:42:09
системы Android размеры
00:42:10
то есть пиксели
00:42:13
очередь отвечает за расположение View
00:42:16
внутри в ее группы на основе полученных
00:42:19
значений из предыдущего паса
00:42:22
мы их измерили получили значение высоты
00:42:28
ширины и дальше пытаемся расположить на
00:42:30
экране
00:42:35
Давайте подробнее рассмотрим каждый
00:42:38
паспался для определения нестандартного
00:42:42
поведения при измерении размеров View мы
00:42:47
как разработчики можем переопределять
00:42:49
метод он менеджеру у кастом навьюхе и
00:42:52
тут представлены шаги
00:42:54
о том как происходит межор ПАЗ менеджер
00:42:58
пас проходит по дереву сверху вниз то
00:43:01
есть фрутовые вьюшки к дочерним при этом
00:43:04
родительская группа передает своим
00:43:06
дочерним вьюшкам требования к размерам с
00:43:10
помощью такого объекта как
00:43:12
дальше рассчитывают свои размеры на
00:43:16
основании
00:43:17
данных из majorspack и на основании
00:43:20
данных которые были заданы разработчиком
00:43:23
и сохраняет их внутренний стейт то есть
00:43:26
значение между
00:43:27
как мы как я и сказал ранее у нас
00:43:33
эти значения могут немного отличаться
00:43:35
потому что мы как разработчики мы не
00:43:39
единственные кто можем задавать
00:43:42
размерности у ёшек это также могут
00:43:44
делать в группы для дочерних вьюшек с
00:43:47
помощью данных smasurespack
00:43:50
также не обязательным шагом но возможным
00:43:55
является повторный пересчёт размеров
00:43:57
из-за нехватки данных для расположения
00:44:00
внутри контейнера нашей вьюшки условно
00:44:04
это бывает двойной Major Pass обычно
00:44:08
бывает
00:44:09
линейро Ялта когда мы задаем размерности
00:44:13
вьюшек с помощью весов то есть с помощью
00:44:15
атрибутов Уайт в этом случае у нас
00:44:18
происходит двойной Major Pass
00:44:22
дальше переходим к layoutpassu во время
00:44:26
паса мы снова проходим по дереву сверху
00:44:29
вниз то есть отрутовый в юрских дочернем
00:44:33
при этом на предыдущем шаге на пасе мы
00:44:36
уже узнали значение который хочет занять
00:44:38
вьюшка
00:44:39
и пытаемся их как-то расположить на
00:44:42
координатной сетке и для переопределения
00:44:46
какого-то нестандартного поведения при
00:44:49
расположении В контейнере мы можем
00:44:52
определить метод
00:44:54
и задать кастомную логику
00:44:57
и последний этап это этап дровинг он
00:45:00
отвечает за отрисовку View для
00:45:04
определения нестандартного поведения
00:45:06
Вью при отрисовке мы можем
00:45:09
соответственно переопределить callback
00:45:11
on Drom
00:45:13
на схеме у нас также отображены два
00:45:17
метода это requestlayout и invalidate
00:45:20
они используются для ручной подсказки
00:45:22
системе Android о том что у нас
00:45:24
поменялись какие-то данные и нам нужно
00:45:28
перерисовать нашу вьюшку То есть это
00:45:30
могут быть
00:45:32
текст
00:45:33
нас могут поменяться текст нас мог
00:45:36
поменяться бэкграунд У нас могли
00:45:38
поменяться отступы
00:45:39
и здесь на картинке справа на слайде
00:45:42
видно что при вызове квест у нас
00:45:46
вызывается метод жизненного цикла
00:45:47
начиная с колбеком Major то есть мы
00:45:50
просим еще раз измерить ее размерность и
00:45:53
расположить на экране
00:45:56
хочется отметить что при вызове квест
00:46:00
вызовы метода этапа дробинг не
00:46:03
гарантированы
00:46:06
вот говоря про инвалидейт
00:46:11
вызывает методы фазы дробинг то есть мы
00:46:13
предполагаем что размеры в июне
00:46:15
поменялись и расположение на экране
00:46:17
поменялось какой-то поменялся какой-то
00:46:18
внутренний стоит например это может быть
00:46:21
цвет бэкграунда
00:46:24
когда она может понадобиться инвалидейт
00:46:27
Ну вот как я и сказал может понадобиться
00:46:30
при изменении бэкграунда
00:46:33
река слоя вот нам может понадобиться
00:46:35
например при изменении отступов то есть
00:46:39
при изменении маржинов
00:46:42
еще важный момент про эти методы они не
00:46:46
запускают перерисовку в тот же момент
00:46:50
когда они были вызваны они лишь
00:46:52
устанавливают флаг для системы Android и
00:46:55
говорят о том что у нас что-то
00:46:56
поменялось
00:46:57
перерисую это как можно скорее поэтому
00:47:00
не всегда количество вызовов этих
00:47:01
методов равняется реальным запуском
00:47:04
Вот и тут был вопрос
00:47:07
в прошлой секции про то почему
00:47:10
Большая влажность Это плохо здесь можно
00:47:13
увидеть небольшую формулу что при
00:47:17
большой вложенности у нас
00:47:20
[музыка]
00:47:22
происходит
00:47:25
N
00:47:27
Major passov потом за которым у нас идет
00:47:32
layoutpass и который увеличивается
00:47:34
назначение V которая равняется в
00:47:37
ложности в югрупп файле То есть у нас
00:47:41
[музыка]
00:47:43
очень часто будут вызываться
00:47:46
колбеки из жизненного цикла вьюшек
00:47:49
поэтому нас будет соответственно очень
00:47:53
очень у нас будет очень ресурсозатратный
00:47:55
экран
00:47:59
готов ответить на вопросы если они есть
00:48:08
промоушен
00:48:11
[музыка]
00:48:13
тут просто рассказать про я вот наверное
00:48:16
в данную лекцию не входит
00:48:18
Я сейчас так сходу не вспомню потому что
00:48:21
это
00:48:23
необычный я вот который с которым не
00:48:26
каждый день встречаешься
00:48:29
[музыка]
00:48:31
Будет ли Профит с точки зрения
00:48:33
производительности с помощью разделения
00:48:35
разметки на несколько файлов
00:48:37
нет
00:48:39
Профит не будет это просто уменьшает
00:48:44
это просто делает XL файлы более
00:48:46
понятными если тут имелось ввиду
00:48:49
вложенность
00:48:51
если тут имелась в виду разделение
00:48:54
файлов и использование других файлов
00:48:56
внутри
00:48:57
других с помощью атрибута с помощью
00:49:00
тегамерш Если вы про это
00:49:05
Будут ли вызываться методы
00:49:08
менеджер если мы вручную укажем размеры
00:49:10
да
00:49:12
то есть эти
00:49:15
колбаки жизненного цикла Наше видео они
00:49:18
будут вызываться вне зависимости от того
00:49:20
что мы укажем это обязательно чекпоинты
00:49:23
через которые мы будем проходить
00:49:29
расскажите пожалуйста примеры Когда нам
00:49:32
полезно переопределять метод
00:49:36
[музыка]
00:49:42
это нам нужно для переопределения
00:49:44
какой-то кастомной логики Скорее это
00:49:47
будет использоваться для Вью групп когда
00:49:49
мы хотим задать
00:49:52
кастомное расположение вьюшек на экране
00:49:55
об этом была лекция упоминалось еще в 21
00:49:59
году на похожей лекции про вьюшки Я
00:50:02
думаю если будет интересно там
00:50:04
приводился реальный пример
00:50:06
где в лаве был написан код с кастомной
00:50:10
группой где мы как раз переопределяли
00:50:13
метод и задавали кастомное расположение
00:50:16
стека
00:50:32
Ну что давайте перейдем к следующей
00:50:33
секции
00:50:35
дальше Хотелось бы поговорить про точи
00:50:38
по экрану про то что происходит в эти
00:50:40
моменты про то как мы можем управлять
00:50:42
кликами
00:50:43
Давайте сразу рассмотрим следующую
00:50:45
иерархию вьюшек в группу А у нас есть
00:50:49
две группы А в которой вложена в игру по
00:50:51
б и есть еще вьюшка дочерняя от
00:50:55
пользователя нам поступает Клик по
00:50:58
вьюшки соответственно каждую вьюшку то
00:51:02
есть для группы Ави группы Б и вьюшку
00:51:04
насыщенные
00:51:06
Клик лица неры где мы
00:51:09
логируем события
00:51:12
и возникает вопрос при клике на вьюшку
00:51:16
какой клик-листнер от работы какого
00:51:20
объекта
00:51:21
отработает
00:51:23
в данном кейсе наверное ответ очевиден
00:51:26
что отработает как лицнер у нашей View
00:51:30
Давайте разбираться куда подевались
00:51:33
обработчики для группы и группы Б И
00:51:37
также мы с вами разберем как мы понимаем
00:51:39
что кейсы мы с вами также разберем кейсы
00:51:43
Когда у нас происходит свайпы либо
00:51:46
двойные клики мы рассмотрим как мы
00:51:48
понимаем что произошло именно в этот
00:51:50
момент при касании экрана пользователям
00:51:54
для того чтобы понять что произошло при
00:51:56
даче Давайте сначала разберемся с таким
00:51:59
понятием как motionland
00:52:01
объект класса Motion Event используется
00:52:04
для сообщения о событиях перемещения на
00:52:06
экране этот класс содержит такие данные
00:52:10
как координаты события на координатной
00:52:12
сетке
00:52:13
содержит данные о силе нажатия и типы
00:52:17
события
00:52:19
типы события бывают следующими
00:52:22
экшн мув
00:52:25
экшенап и экшн-консул
00:52:28
экшен-даун это момент начала жеста когда
00:52:31
пользователь опускает палец на экран
00:52:33
самый первый момент когда мы касаемся
00:52:36
экрана экшен момент когда что-то
00:52:39
происходит на экране то есть экшен
00:52:40
поступает после событий типа Action Down
00:52:45
дальше у нас есть Action Up это
00:52:48
терминальное событие жеста сообщает об
00:52:51
успешном окончании жеста и экшен также
00:52:54
терминальное событие которое
00:52:56
говорит нам о том что же закончился
00:52:58
неуспешно это бывает в кейсах когда мы
00:53:01
прискроле выходим за границы экрана ну и
00:53:05
соответственно Мы хотим отменить наш наш
00:53:09
называется мы получаем
00:53:12
тип события типа экшн-кансел
00:53:15
Да это кстати не все события но это
00:53:19
наиболее основные которые нам
00:53:21
понадобятся в данной лекции
00:53:23
Давайте вернемся к нашему примеру с
00:53:25
кликом и обозначим из чего он будет
00:53:27
состоять он будет состоять из трех типов
00:53:31
событий Да это может показаться что это
00:53:33
какая-то Ударная операция Но на самом
00:53:35
деле Клик включает в себя три события
00:53:37
Так что экшен
00:53:40
Up Action происходит когда мы
00:53:42
только-только начинаем свой Клик то есть
00:53:43
касаемся пальцем экрана затем быстро
00:53:48
происходит экшен который сам по себе не
00:53:51
заметен и у нас
00:53:54
по завершению клика происходит мы
00:53:57
получаем тип события Action Up который
00:53:59
говорит нам о том что
00:54:00
события жестов произошло успешно
00:54:05
и Давайте глянем на следующий год
00:54:07
который
00:54:10
соответствует нашему примеру с Европы
00:54:14
Ави группы
00:54:16
как мы сказали Мы на каждую на весь
00:54:19
листнер
00:54:21
где мы заблокировали события и блок Кати
00:54:25
мы увидим соответствующее событие Типа
00:54:27
clickt если пользователь кликнул по
00:54:29
нашей
00:54:31
но тут может возникнуть вопрос Куда
00:54:34
подевалась обработка кликов у группы А и
00:54:37
у группы Б И работают ли эти клики
00:54:38
Работают ли клики по Европам в целом
00:54:41
ответ да клики по v-группам работают ими
00:54:45
можно управлять
00:54:47
управление кликами происходит с помощью
00:54:50
следующих коллегов которые вы видите на
00:54:52
экране это он Touch Event и On intercept
00:54:55
touch Event
00:54:57
первый метод находится в классе View
00:55:01
принимает на вход объект типа Motion
00:55:04
Event и возвращает значение boolean
00:55:06
метод колбек он Touch Event отвечает за
00:55:10
обработку событий либо комбинации
00:55:12
событий жеста для данной вьюшки
00:55:16
возвращаем им значением мы сообщаем о
00:55:19
том перехватил ли наше событие
00:55:22
или же отказалась от обработки события
00:55:26
и также мы сообщаем вызывающему методу о
00:55:30
том будет перехватывать следующие
00:55:32
события в рамках текущего жеста То есть
00:55:35
можно привести пример если мы в данном
00:55:39
методе будем возвращать значение false
00:55:41
то на вход мы получим объект типа Action
00:55:45
Down
00:55:46
после которого нас по логики должны идти
00:55:51
но если мы возвращаем значение false мы
00:55:54
отказываемся обработки события
00:55:56
то что в рамках этого жеста мы
00:55:59
ничего делать не собираемся
00:56:03
дальше переходим к методу on intercept
00:56:05
touchwent
00:56:07
метод intercepturevent отвечает за
00:56:10
отслеживание событий происходящих на
00:56:12
поверхности в югрупп
00:56:14
и здесь имеется в виду также включение
00:56:18
дочерних vue
00:56:21
на вход в качестве параметра Мы также
00:56:24
получаем событие типа Motion Event и
00:56:27
возвращаем значение типа boolean
00:56:29
возвращаемое значение говорит нам о том
00:56:31
перехватило ли в группа событие
00:56:34
и необходимы ли это событие опрокидывать
00:56:37
вверх по иерархии об этом мы поговорим
00:56:39
немножко позже на следующих слайдах
00:56:42
Ну вот при создании лекции в голове
00:56:45
появилось такая аналогия из мультфильма
00:56:47
кунг-фу панды слева на гифки у нас
00:56:49
пример перехваченного события мы
00:56:52
получили событие сами его как-то
00:56:54
обработали а справа на гифки мы получили
00:56:57
события мы поняли что мы не хотим его
00:56:58
обрабатывать и передали кому-то дальше
00:57:01
Надеюсь что здесь стало понятие
00:57:06
а также у нас есть небольшая схема
00:57:08
обработки нашего клика из первого
00:57:10
примера Давайте пройдемся по вьюшки
00:57:13
посмотрим как бы наше приложение
00:57:15
обработало отработала бы при
00:57:17
переопределении двух этих колбеков
00:57:21
допустим у нас произошел Клик от
00:57:23
пользователя который нам поступил из
00:57:25
Activity
00:57:26
мы получаем этот событие сначала в метод
00:57:30
On treset touch Event у
00:57:33
родительской группы то есть группы А
00:57:36
если же это vie группа захотела
00:57:38
переходить события то мы возвращаем
00:57:40
значение True в методе
00:57:43
и далее У нас отрабатывает метод который
00:57:48
[музыка]
00:57:51
говорит нам о том работал ли в группа
00:57:54
событие или нет Если же мы возвращаем
00:57:56
True то наша группа
00:57:59
Взяла на себя обязательства по обработке
00:58:03
этого клика
00:58:06
Если же группа методе он Touch Event
00:58:09
вернул значение false то мы отказываемся
00:58:12
от
00:58:13
обработки события и мы отказываемся от
00:58:16
получения дальнейших событий в рамках
00:58:18
текущего жеста
00:58:21
если мы не хотим перехватывать события
00:58:25
в нашей группе А мы можем вернуть
00:58:28
значение false в методе reset touchwent
00:58:30
и тогда наше событие опрокинется в метод
00:58:34
андерсепт Touch Event у viegurupe
00:58:36
которая в свою очередь также может
00:58:39
перехватить события И после этого будет
00:58:42
вызван метод он touchi Event который
00:58:45
может также вернуть значение True либо
00:58:49
может вернуть значение false и в этом
00:58:51
случае мы наш тип события прокинем вот В
00:58:55
группе
00:58:57
вернув значение foss в методе то есть мы
00:59:00
как бы прокидываем тип события обратно в
00:59:04
родительскую группу которая также свою
00:59:06
очередь может либо обработать события
00:59:07
либо нет
00:59:10
а если же в игру по б отказалась от
00:59:13
обработки события и вернул значение
00:59:14
false то
00:59:16
[музыка]
00:59:18
наше событие прокидывается к дочерней
00:59:22
View и отрабатывает метод On touch Event
00:59:26
метод on touchivent также может вернуть
00:59:29
у вьюшки значения либо True либо false и
00:59:32
в зависимости от того что она вернула У
00:59:36
нас есть различные сценарии обработки
00:59:39
нашего события если мы возвращаем
00:59:40
значение True то мы говорим то что наше
00:59:43
видео обработало события и мы не
00:59:45
Передаем этот жест Это тип события верх
00:59:50
по иерархии мы сразу возвращаем
00:59:52
возвращаемся условно в активите Если же
00:59:55
мы возвращаем значение false то события
00:59:58
прокидывается наверх в группе б и дальше
01:00:01
на то же самое решает хочет она
01:00:03
обрабатывать события или нет
01:00:07
может возникнуть справедливый вопрос как
01:00:10
обработать различные варианты комбинаций
01:00:12
событий То есть у нас бывают различные
01:00:15
кейсы по типу Long кликов дабл тапов
01:00:19
скроллов и так далее Это все можно
01:00:22
сделать переопределив вручную
01:00:23
callbacking Touch Event и intercept
01:00:26
Touch Event
01:00:27
Но кажется что это достаточно трудно Вот
01:00:31
и для этих кейсов У нас есть такие
01:00:34
объекты как жест детектор жест детектор
01:00:37
сам считает Когда произошло условно
01:00:40
события двойного этапа он сам по
01:00:43
внутренней логике высчитывает
01:00:44
Что произошло при данном жесте и женский
01:00:49
детектор нам предоставляется из коробки
01:00:51
то есть подключать дополнительно ничего
01:00:53
не нужно
01:00:56
здесь представлены Шаги по работе жестов
01:00:59
детектором они выглядят следующим
01:01:01
образом для начала мы переопределяем
01:01:03
метод Touch Event у нашей кастомное View
01:01:06
далее Мы переопределяем колбэк-методы у
01:01:10
интерфейса уже страницы отправляем
01:01:12
каждое событие объект детектор лестер
01:01:16
детектор на основании внутренней логики
01:01:18
определяет Какое событие произошло и
01:01:21
дальше соответственно производится
01:01:23
обработка
01:01:24
жеста в соответствии с коллегом из
01:01:28
интерфейсом
01:01:32
вот здесь представлены колбеки которые
01:01:35
мы можем переопределить для
01:01:39
реакции на различные жесты со стороны
01:01:42
пользователя
01:01:43
далее У нас секция с вопросами можно
01:01:46
писать в чат и кажется вопрос есть
01:01:58
вопрос про callback и перерисовки
01:02:01
происходит я не каждый 16 секунд 16
01:02:03
миллисекунд об этом Мы кстати тоже
01:02:06
поговорим Вот как раз в следующей секции
01:02:08
буквально через пару слайдов
01:02:11
по дефолту
01:02:14
у обоих групп метод
01:02:18
имеет значение Это верно
01:02:29
Ну кажется у нас вопросов больше нет
01:02:32
мы можем переходить к следующей секции
01:02:34
про performance и дебаггинг
01:02:37
и говоря про performance мы как
01:02:40
android-разработчики должны знать о
01:02:41
таком значении как 60 FPS то есть 60
01:02:45
фреймс pressecond эта цифра означает то
01:02:48
что наш экран должен уметь
01:02:49
перерисовываться за
01:02:51
16,6 миллисекунд это значение мы
01:02:54
получаем из деления тысячи на 60 то есть
01:02:58
60 фреймс persecond это 60 кадров в
01:03:01
секунду в секунде 1000 миллисекунд 1000
01:03:04
делим на 60 получаем 16 6
01:03:09
со стороны Android если говорить со
01:03:11
стороны Андроида то
01:03:13
вызов метода для каждой View не должен
01:03:17
занимать больше 16
01:03:19
и 6 миллисекунд
01:03:22
здесь привел несколько рекомендаций для
01:03:27
эффективной отрисовки интерфейса
01:03:30
если мы определяем кастомный View то нам
01:03:34
нужно позаботиться о том что мы
01:03:35
эффективно реализовываем метод и также
01:03:39
мы должны избегать большого количества
01:03:44
а ниже есть еще рекомендации по
01:03:47
написанию метода on Drom
01:03:50
первый самый важный наверное пункт это
01:03:52
не стоит создавать объекты в методе
01:03:55
oндро так как это может повлечь за собой
01:03:58
работу с коллектором потому что локация
01:04:03
локация памяти для объекта
01:04:06
дорогостоящий дорогостоящая операция
01:04:08
соответственно нас Может начать
01:04:10
отрабатывать сборщик мусора который
01:04:12
может вызвать за собой
01:04:15
и также не стоит производить сложные
01:04:17
вычисления в методе oндро мы эти
01:04:20
значения можем сделать до вызова метод и
01:04:23
как-то передать их туда
01:04:26
и на прошлом слайде Мы еще упомянули про
01:04:28
овердром овердром отрисовка одного
01:04:31
пикселя несколько раз во время отрисовки
01:04:33
одного экрана
01:04:34
плохо это не потому что у нас один
01:04:37
пиксель перерисовывается по несколько
01:04:39
раз плохо это потому что у нас плохо
01:04:43
потому что это может говорить нам о том
01:04:45
что у нас есть проблемы в иерархии
01:04:49
например как я уже упоминал это
01:04:52
вложенные группы
01:04:53
и для отслеживания
01:04:55
овердро мы
01:04:59
можем использовать такие инструменты как
01:05:03
дебагпу
01:05:04
Спектр и профайл
01:05:06
два ГПУ это инструмент который
01:05:08
предоставляет возможность визуализации
01:05:11
количества отрисовок пикселей с помощью
01:05:14
цветового кодирования мы можем После
01:05:17
включения опции два г по овердроу
01:05:19
увидеть сколько раз перерисовывался
01:05:21
каждый пиксель на примере справа на
01:05:24
фотографии видно что текст
01:05:25
перерисовывался больше 4 раз так красный
01:05:30
цвет означает что
01:05:33
перерисовка была четыре боли перерисовка
01:05:36
производилась 4 или более раза
01:05:38
соответственно
01:05:40
это может нам подсказывать о том что у
01:05:42
нас есть проблемы в иерархии потому что
01:05:44
для определения одного текста кажется
01:05:47
что это слишком много
01:05:50
четыре вложенные группы
01:05:54
но есть также инструмент Спектр Он
01:05:57
позволяет просмотреть иерархию View для
01:06:00
текущего запущенного приложения и найти
01:06:03
это можно найти этот инструмент можно в
01:06:06
Android Studio в тузах инспекторе и
01:06:09
последний инструмент который мы
01:06:11
поговорим это профайл GPU инструмент
01:06:14
предоставляет информацию о том сколько
01:06:15
времени тратит приложение на тот или
01:06:18
иной вид операции с течением времени в
01:06:21
виде гистограммы условно у нас
01:06:23
горизонтальная ось отвечает за
01:06:25
[музыка]
01:06:28
наши
01:06:30
моменты во времени а вертикальные
01:06:34
Столбцы означают Сколько времени было
01:06:37
потрачено в тот или момент времени
01:06:39
сколько
01:06:40
сколько времени сколько ресурсов
01:06:43
приложения
01:06:44
устройства было потрачено в тот или иной
01:06:46
момент времени
01:06:48
при этом у нас также здесь присутствует
01:06:51
твое кодирование которое говорит нам о
01:06:53
том
01:06:54
на какой вид операции были затрачены
01:06:58
наши ресурсы
01:06:59
вот здесь можно привести пример с
01:07:03
голубыми синим
01:07:05
столбиком
01:07:06
синий отвечает за ресурсы затраченные на
01:07:10
отрисовку нашего экрана а голубой
01:07:14
отвечает за networking работает сетью
01:07:20
также у нас скоро будет секция с
01:07:23
вопросами после которой мы уйдем на
01:07:26
семиминутный перерыв
01:07:28
Да сейчас вернемся к нашему пункту с
01:07:32
овердром мы можем избегать овердрой нам
01:07:35
нужно делать для того чтобы наша для
01:07:37
того чтобы работа с интерфейсом была
01:07:40
приятной для восприятия со стороны
01:07:43
пользователя
01:07:44
для того чтобы избегать овердром мы
01:07:47
можем во-первых удалять невидимые
01:07:49
невидимые бэкграунды layoutsy Мы можем
01:07:52
упрощать
01:07:53
иерархию с помощью таких групп как
01:07:58
же мы можем мешать прозрачностью также
01:08:01
что влияет что плохо влияет на
01:08:03
производительность
01:08:07
всех вопросами
01:08:15
вот есть хороший вопрос про
01:08:19
родительскую View может быть такое что
01:08:22
View нет родителям Какая самая
01:08:25
родительская View Нет убью обязательно
01:08:29
должен быть
01:08:31
родительский элемент
01:08:33
если мы посмотрим на наш самый основной
01:08:36
экран то есть который мы создаем в
01:08:39
mainactivity мы
01:08:41
с помощью метода setcontenview куда-то с
01:08:44
этим наш
01:08:46
интерфейс вот с этим мы его в такую
01:08:50
в такой абстракцию которая называется
01:08:52
Windows это все это вся абстракция
01:08:56
находится
01:08:57
внутри
01:08:59
внутри Андроида внутренняя логика и по
01:09:03
случаю нас для каждой Activity создается
01:09:07
свой Windows где у нас есть одна
01:09:11
родительская куда будут встретиться все
01:09:13
остальные
01:09:14
есть кстати очень небольшая интересная
01:09:17
статья Я натыкался я если напомнить
01:09:31
вопрос про constraint layout
01:09:34
сильно ли он прожорливе чем другие л
01:09:36
яуты
01:09:37
Ну
01:09:39
он прожорливе чем фрейму я вот но я не
01:09:44
думаю что он прожорливичи линеру я вот в
01:09:46
особенности если не Нервы Я вот был
01:09:47
использован
01:09:49
в совокупности с проставлением
01:09:51
размерности с помощью весов
01:10:05
Да тут не подсказывает еще про хореограф
01:10:08
из локат
01:10:10
про то что этот инструмент тоже Может
01:10:12
помогать с воспроизведением проблем с
01:10:15
отрисовкой
01:10:16
Ну слышал но вообще не пользовался
01:10:25
Угу Для чего в детекторе жестов то есть
01:10:27
жестов детекторе Мы сначала
01:10:28
переопределяем он Touch Event мы Для
01:10:32
начала там переопределяем Touch Event
01:10:34
потому что
01:10:39
типа событий для жестов мы можем
01:10:41
переопределять только создав свою
01:10:44
кастомную
01:10:45
и Для этого нам нужно создать свою
01:10:48
унаследоваться от
01:10:51
наследоваться вот абстрактного базового
01:10:53
класса View и там дальше переопределить
01:10:56
метод он Touch Event в котором мы будем
01:10:59
получать эти события то есть мы в этом
01:11:01
методе получаем события жестом
01:11:08
Я думаю что с
01:11:10
вопросами пока можем заканчивать у нас
01:11:14
минутный перерыв Так что не отвечайте
01:11:16
скоро вернемся
01:20:02
давайте рассмотрим еще одну задачу
01:20:05
необходимо отрисовать интерфейс для
01:20:08
экрана с чатами в приложении Messenger
01:20:10
Вот который мы видим сейчас на экране
01:20:12
справа и наш экран состоит из бэкбаттена
01:20:17
назад из заголовка и с фотографии из
01:20:20
компонентов из элементов чата который
01:20:24
каждый в свою очередь дублируется и
01:20:26
содержит в себе фотографию профиля имя и
01:20:28
последнее сообщение в чате
01:20:31
давайте рассмотрим Из чего состоит наш
01:20:33
интерфейс со стороны кода
01:20:36
У нас есть родительская группа Это
01:20:39
очевидно constrate layout У нас есть
01:20:42
также список чатов и ввиду повторяющихся
01:20:44
элементов которые идут друг за друга
01:20:46
друг за другом вертикально можно сделать
01:20:50
вывод что сюда подойдет линейный аут и у
01:20:54
нас еще есть также
01:20:55
отдельный элемент чат-превью который у
01:20:59
нас постоянно дублируется и чтобы не
01:21:01
писать все в одном файле чтобы не писать
01:21:03
большую кучу кода
01:21:05
дублировать в одном файле мы можем
01:21:07
выделить
01:21:09
файл с xml с чатом превью
01:21:16
вот здесь можно посмотреть верст для
01:21:19
[музыка]
01:21:21
верстку для привлечь чата здесь
01:21:24
достаточно мелко но там ничего сложного
01:21:27
Мы также определяем
01:21:33
далее мы определяем и мы живью и два
01:21:37
текста которые как-то
01:21:40
теперь отрисуем наш экран со списком
01:21:43
чатов
01:21:46
У нас есть наш constraitloyaut есть
01:21:50
кнопка назад и заголовок соответственно
01:21:55
соответственно мы используем для
01:21:58
бэкбатана также imageview для заголовка
01:22:00
текст View и для списка чатов определяем
01:22:03
линейро я вот и задаем некоторые
01:22:05
отступы и constraint и
01:22:10
наполнение нашего будет состоять из клуб
01:22:14
тегов которые будут ссылаться на
01:22:17
layout-файл xml с помощью атрибута
01:22:21
чтобы нам не писать весь тот громадный
01:22:24
кусок кода в линию дублировать все друг
01:22:27
за другом Мы можем
01:22:29
просто сослаться
01:22:33
на верстку с помощью
01:22:37
вот это как раз было здесь описано нам
01:22:41
позволяет ставить заранее подготовленный
01:22:42
кусок разметки в другую разметку
01:22:47
Ну по сути мы просто вставили несколько
01:22:49
раз готовую верстку наш линейный layout
01:22:52
и получили результат фотографии справа
01:22:56
но у такого подхода есть проблемы и
01:23:00
Начнем с того что
01:23:02
зачастую у нас количество объектов в
01:23:05
нашем списке оно не константу то есть мы
01:23:07
даже не можем заранее знать это
01:23:09
количество объектов так как они нам
01:23:11
могут приходить условно с бэндом
01:23:15
данные также могут включать несколько
01:23:18
разновидностей разновидностей объектов
01:23:20
на примере с чатами это могут быть чаты
01:23:23
с сообщениями и видеочаты
01:23:27
которые могут
01:23:29
чередоваться друг за другом в списке
01:23:32
также
01:23:34
наши данные чатов могут меняться в
01:23:36
режиме реального времени и могут
01:23:38
требовать некоторые анимацию для того
01:23:40
чтобы пользователь было понятно что
01:23:41
сейчас произошло
01:23:42
и тут становится очевидно что ли яут нам
01:23:47
не способен дать требуемую гибкость
01:23:49
сочетание с простотой пигментации
01:23:52
списков например
01:23:55
наш список чатами можно сделать с
01:23:57
помощью это можно делать все программное
01:23:59
можно добавлять программно достаточно
01:24:02
много элементов
01:24:05
добавлять анимацию но
01:24:09
у такого подхода есть много минусов это
01:24:12
много бойлер проектного кода и большая
01:24:15
вероятность ошибки Ну и также это
01:24:17
требует вообще колоссальных усилий
01:24:20
то там на помощь может прийти
01:24:22
представитель View которым наверное уже
01:24:24
многие догадались
01:24:27
представители View это инструмент для
01:24:29
эффективного отображения больших наборов
01:24:31
данных и также это является в Европой в
01:24:34
базовом варианте
01:24:35
ресайкер включает в себя такие объекты
01:24:38
как beholder адаптер и layout-менеджер
01:24:40
то есть минимальный набор из которого
01:24:42
должен состоять ресайтлер но также он
01:24:45
может включать и другие классы которые
01:24:47
предназначены для кастомизации например
01:24:50
этому аниматор айтом декарейшен И вообще
01:24:53
таких классов примерно около 25
01:24:56
штук в классе писателя View вот такое
01:25:00
разнообразие появилось ввиду того что
01:25:02
Достаточно мощный инструмент который
01:25:05
позволяет реализовывать большое
01:25:07
количество
01:25:09
функциональностей и вот разработчики
01:25:12
этого инструмента решили декомпозировать
01:25:15
работу со списками достаточно четкий
01:25:18
понятный класс Согласитесь что если
01:25:21
вся наша кастомизация была бы
01:25:23
располагалась в одном классе это было
01:25:26
совсем неудобно с учетом того что у нас
01:25:29
как минимум 25
01:25:32
классов
01:25:34
которые располагаются в классе
01:25:36
ресайтливью
01:25:39
Вот Но также хочется упомянуть что
01:25:42
классы которые мы показывали На прошлом
01:25:45
слайде они не являются единственными при
01:25:48
работе с рисайкером у нас также есть
01:25:52
классы для кастомизации ресеплеров
01:25:54
пакете ресайкервью сюда может сюда можно
01:25:57
отнести диффутиль Снаб хелпер также есть
01:26:01
готовые реализации интерфейсов из класса
01:26:03
review это
01:26:05
линеры менеджер это симпатитом аниматор
01:26:08
дефолтать нанимать аниматор и всего
01:26:11
таких классов и интерфейсов примерно
01:26:13
около 30 штук
01:26:16
на этом слайде
01:26:18
можно глянуть Что такое что на себя
01:26:22
представляет
01:26:23
это может быть обычный список из строк
01:26:26
это может быть список из фотографий
01:26:29
строк То есть это повторяющиеся элементы
01:26:32
которые обычно стоят из которые обычно
01:26:34
выглядят одинаково также есть интерфейс
01:26:38
посложнее который взят из истории
01:26:42
из истории поиска
01:26:45
есть вот такой интерфейс посложнее он
01:26:48
уже включает в себя функциональность по
01:26:50
смахиванию
01:26:53
есть еще следующий пример который
01:26:55
наверное в принципе ломает все
01:26:57
представление о ресайтере как об
01:27:00
инструменте
01:27:01
позиционирования вьюшек вот нас это все
01:27:05
еще ресайтлер но он достаточно кастомный
01:27:08
люди над ним очень долго трудились мне
01:27:10
кажется
01:27:12
дальше Давайте глянем на схему работы
01:27:14
ресайтера сразу здесь оговорочка что это
01:27:17
минимальная жизнь жизнеспособная схема
01:27:19
работы
01:27:21
то есть безразличного рода кастомизации
01:27:23
списков сперва как и у любой бьющие
01:27:28
отрабатывает метод
01:27:30
время которого мы Обращаемся К менеджеру
01:27:35
с помощью
01:27:38
я вот менеджер обращается к адаптеру
01:27:43
узнает количество элементов в списке
01:27:45
узнает тип объектов в списке создает
01:27:49
beholder для элемента в списке и бандит
01:27:52
данные с их представлением по итогу мы
01:27:55
получаем
01:27:56
конечный список с фьюхами и возвращаем
01:28:00
этот набор
01:28:04
Давайте еще раз глянем что от нас
01:28:06
требуется реализовать нам нужно
01:28:09
отобразить следующий кран который сейчас
01:28:10
можете увидеть на слайде
01:28:12
нам нужно уметь отображать
01:28:15
количество чатов вне зависимости от того
01:28:18
какой какое число элементов нам пришло в
01:28:20
списке и также нам нужно уметь
01:28:22
поддерживать Scroll списка потому что
01:28:25
количество чатов может быть достаточно
01:28:27
большое и они могут не все влезть на
01:28:31
экран смартфона
01:28:33
Ну что у нас было достаточно много
01:28:35
информации Давайте попробуем сначала
01:28:38
писать Шаги по реализации
01:28:41
ресайтлера и начнем мы
01:28:44
с разметки
01:28:47
с написанием разметки далее перейдем к
01:28:50
модели данных то есть напишем нашу
01:28:52
модель данных дата класс перейдем к
01:28:55
написанию холдера далее будет адаптер и
01:28:59
все это все это по итогам скомпонуем в
01:29:02
одной сущности в сайте и это будет нашим
01:29:06
так скажем
01:29:08
будет писатель который уже функционирует
01:29:11
Но в нем еще будут некоторые изъяны
01:29:14
для того чтобы
01:29:16
был условно проданным чтобы можно было
01:29:20
показывать пользователям Нам нужно будет
01:29:22
добавить
01:29:23
некоторую декорацию Нам нужно будет
01:29:26
найти файть элементы об их изменении
01:29:30
Нам нужно будет добавить анимацию
01:29:33
Мы также изучим менеджер и посмотрим
01:29:36
работу с множественными типами вьюшек
01:29:42
Давайте приступим для начала на Первом
01:29:45
шаге как я обозначили мы файле
01:29:47
Activity
01:29:49
main.xml заменяем линеру яд на рестайлер
01:29:52
View также оставляем его отступы и
01:29:55
constraint и
01:29:57
На дизайне Мы видим что у нас
01:30:00
наши превью чатов они повторяются как
01:30:04
уже было сказано ранее соответственно Мы
01:30:07
также можем переиспользовать наш чат
01:30:09
превью xml с прошлого примера то есть
01:30:13
такая же такой же я вот файл
01:30:16
[музыка]
01:30:17
превью мы его не меняли
01:30:20
на втором шаге мы должны подготовить
01:30:22
модель данных моделью данных будет
01:30:24
являться класс чат превью который будет
01:30:27
хранить данные об ID
01:30:30
User
01:30:32
фотографии юзера типа drawble будет
01:30:36
username и
01:30:37
message то есть имя пользователя и
01:30:40
последнее сообщение в чате
01:30:42
переходим к третьему шагу это View
01:30:44
Holder тут немножко будет теории
01:30:47
вихолдер это объект который содержит
01:30:50
ссылку на представление то есть навью
01:30:53
на представление одного элемента в нашем
01:30:56
списке и задачи холдера будет входить
01:31:00
хранение ссылки на представление то есть
01:31:02
навью хранение метаданных о расположении
01:31:05
представления в списке
01:31:07
например это может быть позиция элемента
01:31:10
в списке и не обязательно пунктом но
01:31:14
Вест он будет являться привязка данных
01:31:16
из дата класса в представлении
01:31:19
дальше мы дальше думаем поймем что
01:31:23
имеется в виду здесь
01:31:25
сейчас на экране Можно увидеть полный
01:31:27
код нашего бьюхолдера мы его назвали
01:31:30
чат-превью холдер унаследовали от
01:31:32
базового бьюхолодера в конструкторе
01:31:36
передали itembew типа View и
01:31:39
с помощью методов findview BYD мы нашли
01:31:43
мы нашли
01:31:46
бьюхи которые нам нужно будет как-то
01:31:49
менять то есть в User фото Нам нужно
01:31:52
будет задать фотографию профиля
01:31:54
пользователя
01:31:55
в юзернейм типа текст нужно будет задать
01:31:58
соответственно
01:32:00
username и так далее и также мы
01:32:04
реализовали метод онлайн куда на вход мы
01:32:07
передали чат превью объект превью это
01:32:11
объект То есть это наш дата класса
01:32:13
Откуда мы получаем данные и после этого
01:32:17
мы получили данные мы знаем куда мы эти
01:32:20
данные можем применить и соответственно
01:32:23
с этим данные в представлении
01:32:26
переходим к следующему четвертому шагу
01:32:29
это
01:32:30
адаптер адаптер это класс который
01:32:34
является посредником между набором
01:32:36
данных и их представлением пару фактов
01:32:38
про адаптер адаптер это абстрактный
01:32:40
класс он является обобщенным И входит в
01:32:44
классе писателей
01:32:46
сейчас пошагово реализуем адаптер для
01:32:50
чатов для начала мы наследуемся от
01:32:52
базового адаптера из класса ресепфер
01:32:56
View и
01:32:57
указываем тип
01:32:59
дженерик Type у адаптера типа чат
01:33:03
превьюхолдер
01:33:04
далее мы можем видеть ошибку в Android
01:33:07
студии о том что нам не хватает
01:33:09
имплементации некоторых методов как
01:33:12
здесь показано фотографии на слайде
01:33:16
эти методы это методом клиент-холдер это
01:33:19
аккаунт и онлайн-вихолдер вот далее мы
01:33:22
их имплементируем и Давайте поговорим
01:33:26
про каждый метод в отдельности он перед
01:33:28
холдер это метод который
01:33:32
создает нам объект
01:33:36
необходимый холдер
01:33:39
Count метод который возвращает
01:33:41
количество объектов в списке и онлайн
01:33:44
холдер это метод который
01:33:46
светит данные в представлении
01:33:51
давайте начнем реализовывать адаптер
01:33:54
начнем с метода getting Count
01:33:57
по названию метода достаточно очевидно
01:34:00
что метод возвращает количество объектов
01:34:02
в списке тут возникает вопрос Где нам
01:34:04
хранить этот список этот список можно
01:34:06
хранить прям тут прям адаптере для этого
01:34:09
мы создаем
01:34:10
переменную типа чат
01:34:13
точнее переменную чат типа
01:34:16
лист с типом с женой жене Рик Китая
01:34:20
помчат превью
01:34:21
и в методе Китая там аккаунт мы
01:34:24
возвращаем значение размерности этого
01:34:28
списка
01:34:29
далее реализуем метод geholder метод
01:34:33
возвращает
01:34:34
beholder нашего типа то есть чат превью
01:34:37
холдер
01:34:40
Давайте поговорим более подробно о том
01:34:42
что делает этот метод этот метод с
01:34:45
помощью
01:34:46
такого объекта как
01:34:48
флейтит нашу наш xml-код
01:34:53
в представлении типа View с помощью
01:34:57
Мы берем наш чат превью
01:35:00
наш xml-код и создаем из него готовую
01:35:04
игрушку которую мы можем потом
01:35:05
использовать в коде и это вьюшка она
01:35:09
передается в Конструктор нашего
01:35:11
вихолдера
01:35:12
прихолдер
01:35:15
соответственно возвращается
01:35:21
и тут следует обратить особое внимание
01:35:23
на последний элемент точнее последний
01:35:26
параметр в методе inflate
01:35:28
atache to Root
01:35:31
этот параметр обязательно должен быть в
01:35:33
значении false Потому что писатель View
01:35:37
он самостоятельно
01:35:39
управляет
01:35:41
самостоятельно управляет атачем вьюшек в
01:35:45
списке на экран
01:35:48
если мы передадим значение True
01:35:52
параметр параметра tocht Root мы можем
01:35:56
получить соответствующую ошибку которую
01:35:57
мы видим студии Ну по названию здесь
01:36:00
достаточно все понятно это название
01:36:02
говорит нам о том что вьюне должны быть
01:36:05
переотаточные к родителю при их создании
01:36:08
и переходим к методу online veholder в
01:36:12
этом методе мы должны обновить либо
01:36:14
задать либо обновить данные для
01:36:16
определенной View то есть на вход мы
01:36:18
получаем на вход в этот колбек мы
01:36:19
получаем наш холдер типа чат-превью
01:36:22
холдер и позицию элементов в списке и
01:36:25
далее мы вызываем метод online который
01:36:28
мы определили в чат превью холдере
01:36:30
передавая туда объект нужного типа из
01:36:34
списка элементов Вот и тут хочется
01:36:37
остановиться на
01:36:39
том моменте Почему мы определили метод
01:36:43
онлайн в методе в классе холдер наверное
01:36:47
очевидно что
01:36:49
если у нас была логика больше Если наша
01:36:53
логика состояла больше чем из трех
01:36:57
вьюшек в нашем чат превью
01:37:00
то наш код выглядел бы достаточно
01:37:05
массивным и отслеживать все эти
01:37:08
изменения в методе Hold было бы
01:37:11
достаточно трудно если к этому еще
01:37:13
подключить
01:37:17
представление различных вьющих в нашем
01:37:19
списке
01:37:20
то там вообще была каша
01:37:24
дальше у нас происходит достаточно
01:37:26
простые манипуляции с рисайкером мы ищем
01:37:30
наш риса с помощью метода findview BYD
01:37:33
создаем чат адаптер дальше создаем
01:37:37
layout-менеджер о том что он означает мы
01:37:40
поговорим немножко позже Сейчас можно
01:37:42
представлять себе layout-менеджер как
01:37:44
способ позиционирования на экране точнее
01:37:46
в списке
01:37:48
Ну и далее мы с этим адаптер
01:37:52
соответствующее свойства у саййлера с
01:37:55
этим менеджер и меняем
01:37:58
[музыка]
01:37:59
с этим данные в
01:38:04
свойства чац эти данные для чатов мы
01:38:07
получаем из репозиторий который по сути
01:38:10
дублирует логику
01:38:14
условно бэкент на минималках где мы
01:38:18
возвращаем рандомное количество
01:38:21
элементов списка
01:38:24
результат можно увидеть на экране мы
01:38:26
получили достаточно близкий дизайн
01:38:28
интерфейс но у нас еще есть заметные
01:38:30
различия нас как минимум не хватает
01:38:33
в этом поговорим в следующей секции у
01:38:37
нас закончилась
01:38:43
вопросами можете их задавать
01:38:45
постараюсь ответить
01:38:57
Ну да тут задали Хороший вопрос почему
01:39:00
не рисокеры View для прокрутки
01:39:02
Ну как раз таки мы к этому и пришли
01:39:16
есть такая возможность чтобы рисовать
01:39:18
View сразу построил весь список
01:39:21
и не во время прокрутки Чтобы избежать
01:39:24
фризов когда элемент тяжелые
01:39:28
Я думаю что
01:39:31
вы не сможете
01:39:34
заранее
01:39:36
определить точнее создать все
01:39:40
необходимые View условно из нас будет
01:39:42
состоять список из тысячи элементов то
01:39:45
это будет очень
01:39:47
ресурсозатратно для нашего смартфона у
01:39:50
которого ограниченные ресурсы Но этим
01:39:53
можно управлять я об этом мы поговорим
01:39:55
немного позже точнее я просто упомяну
01:39:57
скорость но
01:39:58
я думаю можете об этом почитать Я просто
01:40:01
инструмент для работы для необходимых
01:40:05
функциональности
01:40:08
[музыка]
01:40:15
а Будем ли сокращать вобью текст
01:40:17
сообщения если он длиннее в рамках
01:40:19
лекции я этого не делал
01:40:21
Я думаю что это не нужно это достаточно
01:40:24
простая функциональность
01:40:27
Можно ли передавать список в
01:40:29
конструкторе адаптера а не писать его в
01:40:31
самом адаптере это сделать можно но
01:40:35
вопрос
01:40:36
как тогда мы будем менять данные в
01:40:40
списке
01:40:44
на один рестайл один адаптер
01:40:48
или адаптер можно использовать несколько
01:40:50
ресайтлов
01:40:52
Ну
01:40:54
один адаптер нас предназначен для одного
01:40:58
ресайкла точнее объект одного адаптера
01:41:01
предназначен для одного
01:41:03
представил
01:41:06
можно создать несколько объектов одного
01:41:09
адаптера одного типа адаптера и
01:41:11
использовать их в различных сценариях но
01:41:13
один объект для одного рецептора
01:41:21
Я думаю секция с вопросами можем
01:41:24
заканчивать и переходим к нашей
01:41:27
финальной к нашему финальному блоку
01:41:32
давайте рассмотрим такой объект как
01:41:34
айтом декарейшн этот объект позволяет
01:41:37
добавить отрисовку для ресайтлера
01:41:41
для нашего списка и добавить отступы
01:41:44
определенным элементам в списке задачи
01:41:47
этом decretion входят отрисовка фигурка
01:41:50
Вверх ресайкера с помощью метода Over
01:41:53
отрисовка фигур по адреса икером с
01:41:55
помощью методам с помощью метода oндро и
01:41:58
проставление отступа для каждого
01:42:00
элемента с помощью метода гитаймов сет
01:42:02
Давайте попробуем проставить наши
01:42:05
представить отступы нашим элементам в
01:42:07
списке к нам не хватало для этого
01:42:10
создаем свой
01:42:13
превью Куда в конструкторе мы Передаем
01:42:17
сеты
01:42:21
[музыка]
01:42:24
далее мы переопределяем метод
01:42:27
где мы с этим эти данные То есть сейчас
01:42:30
это
01:42:32
фигуре ал-трек А вот проект это фигура
01:42:37
для
01:42:39
прямоугольник для элементов списке
01:42:42
прямоугольник для каждого для каждой
01:42:44
девушки в списке
01:42:45
и тут стоит помнить что этот метод
01:42:49
принимает значение в пикселях Поэтому
01:42:52
при создании
01:42:55
элементы чат-превью при создании объекта
01:42:58
чат previewset and decation в классе
01:43:00
mainactivity Мы
01:43:03
16dp
01:43:05
16f превратили в пиксели и дальше уже их
01:43:09
передали
01:43:11
получили соответствующую соответствующий
01:43:14
результат теперь наш список чатов стал
01:43:16
пригоднее для использования
01:43:17
пользователей наверное будет удобно
01:43:18
более удобно для восприятия картинка
01:43:23
в качестве примера
01:43:25
зарезервированного класса можно привести
01:43:29
он находится
01:43:31
в пакете сайт интервью и этот класс
01:43:34
добавляет разделители между элементами
01:43:39
здесь Мы также добавили
01:43:41
наш собственный
01:43:46
снизу и сверху
01:43:48
и скомпоновали эти два и получили
01:43:51
соответствующий результат как сейчас у
01:43:54
нас представлена на слайде наверное
01:43:56
будет плохо видно но между элементами
01:43:59
чата между элементами списка можно
01:44:02
увидеть
01:44:03
небольшой разделитель серого цвета
01:44:07
что тоже является достаточно удобный
01:44:09
функциональностью
01:44:13
но списки в списке данных представителей
01:44:16
они обычно не статичные Давайте
01:44:18
попробуем добавить функциональность
01:44:20
полутуре Фреш чтобы у нас при
01:44:23
подтягивании чатов
01:44:26
чтобы у нас встретились новые данные в
01:44:29
этот список мы будем просто перезапрашивать данные
01:44:32
из репозитории которые нам будет
01:44:33
возвращать рандомное количество чатов
01:44:36
то есть по сути после
01:44:39
после
01:44:42
у нас должно поменяться количество чатов
01:44:44
в списке как сейчас приведено на слайде
01:44:50
разметку мы меняем
01:44:53
совсем совсем немного мы нашли
01:44:57
оборачиваем такой объект
01:45:00
и переносим отступы из рестайкеров врешь
01:45:06
мы добавляем
01:45:10
для объекта Refresh где мы
01:45:15
Обращаемся из репозитория и с этим новые
01:45:20
данные
01:45:21
список чатов которые располагаются нашим
01:45:25
адаптере
01:45:27
Давайте попробуем запустить приложение и
01:45:30
посмотреть на результат но здесь можно
01:45:32
заметить что данные не обновляются
01:45:34
да давайте разбираться почему так
01:45:36
происходит когда мы меняем поле чат в
01:45:39
адаптере мы просто меняем данные но мы
01:45:42
никак не оповещаем адаптер о том что
01:45:44
наши данные поменялись
01:45:46
для того чтобы данные обновились нам
01:45:49
нужно вызвать метод на тифай дата
01:45:51
setchanged который мы можем вызвать в
01:45:54
сеттере при проставлении нового значения
01:45:56
для списка чатов
01:45:59
запускаем приложение видим
01:46:02
соответствующий результат теперь наши
01:46:04
списки с чатами обновляются
01:46:09
но
01:46:10
если мы если мы напишем метод change
01:46:15
адаптере мы можем заметить worlding
01:46:18
Android Studio появляется предупреждение
01:46:20
о том что
01:46:22
рассчитывает на этот метод стоит как на
01:46:25
самый последний вариант такое происходит
01:46:27
из-за того что этот метод он достаточно
01:46:30
неэффективен и он триггерит полный
01:46:32
перепозиционирование и перерисовывание
01:46:34
элементов в списке
01:46:36
и он
01:46:40
метод
01:46:42
просто говорит нам о том что Давай еще
01:46:44
раз заново перерисуем весь список вместо
01:46:47
того чтобы сказать нам что именно
01:46:49
поменялось
01:46:50
и Для этого нам предлагают
01:46:54
несколько других методов У нас есть
01:46:58
методы которые могут идентифицировать об
01:47:02
изменении в порядке элементов в списке и
01:47:05
методы которые идентифицируют об
01:47:07
изменениях данных в элементах Вот они
01:47:10
соответственно сейчас представлены на
01:47:11
экране
01:47:13
давайте рассмотрим
01:47:15
эти два примера на Первом видео у нас
01:47:20
был реализован Адаптер с использованием
01:47:22
метода
01:47:24
на втором видео у нас приведено
01:47:28
использование где мы передали количество
01:47:32
элементов в новом списке и можно
01:47:35
заметить что у нас
01:47:37
на втором видео видна более плавная
01:47:40
анимация Она наверное не очень сильно
01:47:42
видна но далее мы видим ее в более
01:47:48
ярком проявлении
01:47:51
Да но тут возникает вопрос что вручную
01:47:55
отслеживать изменения каждого элемента
01:47:56
будет достаточно сложно Например можно
01:47:58
представить себе большие списки в
01:48:00
которых у нас поменялось около 50
01:48:02
элементов у нас большая у нас появляется
01:48:05
большая вероятность ошибки при ручном
01:48:07
отслеживании изменений и появляется
01:48:09
много более плотного кода для решения
01:48:12
этой проблемы у нас есть такой элемент
01:48:15
под названием диффутиль диффутиль это
01:48:18
класс который предназначен для улучшения
01:48:20
производительности ресеплера при
01:48:22
обновлениях списком задачи диффутиля
01:48:25
входят определение изменения положения
01:48:28
элементов в списке также он определяет
01:48:30
изменились ли данные в элементе в одном
01:48:33
и том же элементе если положение в
01:48:35
списке не поменялось и также
01:48:38
диффутиль определяет
01:48:40
те данные которые были изменены изменены
01:48:44
изменены в одном и том же объекте
01:48:46
старого и нового списка для их анимации
01:48:49
для их точечной анимации
01:48:52
Давайте теперь реализуем
01:48:54
у нас есть четыре обязательных для
01:48:57
переопределения метода это
01:49:00
News
01:49:04
и в самом начале Мы также конструктор
01:49:07
нашего колбека диффутиля Передаем старый
01:49:13
новый список
01:49:17
Давайте попробуем реализовать метод
01:49:19
метода Get Old лиса из Египет мюлисайз
01:49:22
здесь мы просто возвращаем
01:49:24
количество объектов в списке
01:49:27
метод rything возвращает результат
01:49:30
сравнения элементов из старого списка и
01:49:33
нового и говорит нам о том
01:49:37
один лето и тот же элемент из старого и
01:49:41
нового списка Например если представить
01:49:43
наш пример с чатами
01:49:44
то имплементации этого метода будет
01:49:47
сравнение
01:49:48
чата из старого списка чата из нового
01:49:50
списка по айдишнику
01:49:53
в данном случае может быть уверены что
01:49:55
это один и тот же чат
01:49:58
вот в конструкторе мы Передаем callback
01:50:01
для сравнения этих объектов в базовом
01:50:04
варианте этот колбек будет сравнивать
01:50:06
элементы по простому равенству и дальше
01:50:09
методы мы
01:50:11
находим элементы старого списка находим
01:50:14
элементы нового списка и вызываем
01:50:17
callback
01:50:18
с использованием этих двух объектов и
01:50:21
определяем является ли элементы старого
01:50:24
списка является элемент из нового списка
01:50:27
чем же
01:50:28
каким он был старым списке
01:50:33
а метод арконтон D7 в свою очередь
01:50:37
вызывается только если метод орать там с
01:50:40
DSM вернул значение True поэтому
01:50:43
[музыка]
01:50:45
метод arcontence DSM возвращает
01:50:49
результат сравнения
01:50:51
данных одного и того же элемента то есть
01:50:53
элементы старого списка элементы из
01:50:55
нового списка и он сообщает нам о том
01:50:57
поменялось ли визуальное наполнение
01:51:00
объекта Ну либо их
01:51:03
наполнение на уровне слоя данных
01:51:07
например с чатами Здесь нам пришлось
01:51:11
сравнивать имя пользователя его аватарку
01:51:14
и последнее сообщение
01:51:18
и в конце используем наш итиль в
01:51:20
адаптере при обновлении списка мы
01:51:23
создаем соответствующий куда Передаем
01:51:25
старый список и новый список и
01:51:27
определяем колбэк для методам где мы
01:51:30
сравниваем чаты по idшнику дальше мы
01:51:34
высчитываем разницу с помощью
01:51:36
и применяем изменения с помощью
01:51:41
и результат применения диффутина можно
01:51:44
сейчас увидеть на экране в сравнении с
01:51:47
использованием
01:51:49
сейчас у нас видно что если элемент если
01:51:53
элемент в списке не поменялся но изменил
01:51:56
свое положение он не перерисовывается он
01:52:00
просто меняет свою позицию
01:52:08
при каких-либо изменениях данных в
01:52:11
списке условно При появлении элемента
01:52:13
или его удаление или изменение мы можем
01:52:16
добавить
01:52:17
соответствующую анимацию на каждый вид
01:52:21
на каждый вид действий с этим объектом
01:52:24
Для этого нам предоставляется такой
01:52:28
класс какая-то аниматор и
01:52:30
соответствующий метод который сейчас
01:52:31
представлены на экране соответственно
01:52:34
анимирует появление объекта аниме
01:52:37
дисперцы анимирует
01:52:38
исчезновение объектов с экраном
01:52:41
и другие тоже достаточно понятно по
01:52:44
смыслу
01:52:48
писатель View из коробки уже дефолту
01:52:51
обладает этим аниматором
01:52:55
за счет него происходит анимация при
01:52:57
использовании диффутиля и при
01:52:59
использовании методов
01:53:04
и давайте рассмотрим еще одну задачу
01:53:07
точнее под задачу Нам необходимо сделать
01:53:10
так чтобы наши новые чаты при обновлении
01:53:13
списка появлялись сверху и Приезжали
01:53:18
анимировались в самый низ и вставали на
01:53:21
свою позицию
01:53:22
для этого мы создаем
01:53:24
собственный собственную реализацию айтом
01:53:28
аниматора чат аниматор наследуемся от
01:53:31
дефолтайтом аниматора и переопределяя
01:53:33
метод Animate pirance
01:53:36
мы вызываем метод Animate Move и
01:53:40
Передаем начальные координаты нашего
01:53:42
объекта то есть 00
01:53:44
и Передаем
01:53:46
координаты элементы конечные координаты
01:53:50
элементы он должен стать
01:53:52
свою позицию
01:53:55
далее мы просто задаем анимацию методе
01:53:57
он клеит класса mainactivity делаем Это
01:54:01
с помощью переопределения
01:54:03
свойства айтом аниматор
01:54:10
соответственно получили получили
01:54:13
соответствующий результат который видели
01:54:15
ранее
01:54:17
Давайте поговорим про layout-менеджеры
01:54:20
менеджер это класс который отвечает за
01:54:23
измерение позиционирования элементов в
01:54:25
списке а также за переиспользование
01:54:28
View в списке layout-менеджеры бывают
01:54:31
следующих видов это линеры Out Manager
01:54:34
gridle я вот менеджер и 100 менеджер
01:54:37
также у нас есть Также мы можем
01:54:41
создавать свои кастомные имплементации
01:54:42
менеджеров
01:54:46
линеры менеджер он бывает вертикальной и
01:54:50
горизонтальный чтобы название наверное
01:54:51
достаточно очевидно Это здесь можно
01:54:53
привести аналогию с линейного яопом Мы
01:54:56
также позиционируем элементы либо
01:54:57
вертикально либо горизонтально
01:55:00
гриль менеджер позиционирует элементы по
01:55:04
заданной сетке например мы определяем
01:55:06
что у нас есть два столбца фотографии
01:55:08
справа и дальше каждая строка будет
01:55:11
иметь высоту равную больше высоте из
01:55:15
двух соседних элементов
01:55:18
говоря просто говорит менеджер он
01:55:22
позиционирует элементы также как говорил
01:55:25
менеджер но теперь вы 100 столбцов она
01:55:29
столбцов не зависит от соседних
01:55:31
элементов
01:55:33
есть также кастомная имплементации
01:55:35
layout-менеджеров которые Вы сейчас
01:55:37
можете увидеть на экране это достаточно
01:55:39
сложная имплементация но к счастью
01:55:43
[музыка]
01:55:45
различного рода Анимация Я очень
01:55:49
элементов в списке
01:55:51
уже реализованы за нас есть библиотека
01:55:56
которую вы можете найти по qr-коду либо
01:55:58
по ссылке
01:55:59
точнее эта ссылка на github куда
01:56:02
выкладываются не более такие необычные и
01:56:05
в имитации кастомных лауд-менеджеров
01:56:07
и Давайте дальше рассмотрим еще одну
01:56:10
возможность
01:56:12
ресеплеры это Последний пункт на сегодня
01:56:15
допустим у нас есть задача отображать
01:56:18
списке не только чаты
01:56:20
только чаты сообщениями также видеочаты
01:56:23
как на примере на слайде
01:56:27
для этого мы Для начала создаем ход
01:56:30
реализации примерно соответствует
01:56:33
Наши первые имплементации
01:56:35
для начала Мы также задаем некоторый
01:56:38
файл видеочат превью
01:56:41
в котором мы
01:56:43
с помощью
01:56:45
того же концентра выставляем 3
01:56:48
относительно друг друга далее добавляем
01:56:52
еще одну модель данных это видеочат и
01:56:55
выделяем общую модель данных типа чат
01:56:58
куда мы Передаем
01:57:02
дальше мы добавляем новый vehold типа
01:57:06
видеочат beholder здесь алгоритм
01:57:08
имплементации точно такой же как и на
01:57:11
предыдущем шаге с ю-холдером
01:57:15
Вот и теперь нам нужно изменить наш
01:57:17
адаптер для начала мы меняем дженерик
01:57:19
Type с чат превью холдер на обобщенный
01:57:22
тип veholder потому что теперь у нас
01:57:25
есть две вариации холдеров далее мы
01:57:30
определяем в компанию object 2 константы
01:57:33
типа int и задаем значение 0.1
01:57:36
и переопределяя метод gettype который
01:57:40
говорит нам о том какую
01:57:44
какой тип элементов в списке но сейчас
01:57:47
нужно отобразить
01:57:48
условно это либо чат превью в данном
01:57:52
текущем случае либо видеочат либо
01:57:55
элемент обычного чата либо элемент
01:57:58
видеочата
01:58:05
Далее в методе oncreadvi Holder Мы
01:58:09
заменяем наш наша возвращаемое значение
01:58:12
сейчас превью холдера на обобщенный Тип
01:58:15
veholder и в зависимости от полученной
01:58:18
константы на вход в callback то есть
01:58:22
vitape мы реализуем различные
01:58:25
вихолдеры если нам прилетел чат-превью
01:58:28
Type то мы реализуем чат превью холдер
01:58:31
если прилетает видеочат Type то мы
01:58:33
реализуем Наш новый вихолдер видеохолдер
01:58:39
внутренняя имплементация для каждого
01:58:41
виходе остается такой же точно также с
01:58:44
помощью представления
01:58:51
методе холдер мы получаем
01:58:56
также необходимый холдер
01:59:01
здесь Мы также меняем превью холдер на
01:59:04
видеохолдер и Передаем модель данных
01:59:07
метод онлайн преобразуя перед этим в
01:59:10
нужный тип либо видеочат
01:59:15
и вот таким образом мы получили
01:59:18
требуемый результат теперь у нас в
01:59:21
списке есть не только
01:59:23
элементы обычного чата но также видеочат
01:59:26
весь код можно найти по ссылке либо по
01:59:29
qr-коду
01:59:30
обязательно его Гляньте
01:59:33
Я думаю что мне нет ничего особо
01:59:35
сложного
01:59:37
видов жирности функционала у ресайтервью
01:59:41
мы еще не все успели рассмотреть даже не
01:59:45
рассмотрели половину
01:59:47
здесь хотелось бы быстро пройтись потому
01:59:51
что мы не успели затронуть про возможных
01:59:53
оптимизацию списков У нас есть такой
01:59:56
элемент
02:00:00
это предоставляет возможность изменения
02:00:03
элемента без его полного Перри
02:00:05
рендеринга Как на примере Слева давайте
02:00:09
рассмотрим пример слева для начала у нас
02:00:11
при
02:00:13
клике на иконку лайка у нас Перри
02:00:17
рендривается вся карточка
02:00:20
видео справа когда мы кликаем на кнопку
02:00:23
лайк у нас
02:00:25
обновляется только вьюшка с лайком то
02:00:28
есть нас не моргает вся карточка
02:00:31
есть также механизм prefetch это
02:00:34
механизм настройки предзагрузки
02:00:36
следующих элементов в списке которые
02:00:38
подается кастомизации это как раз то что
02:00:41
спрашивали на одной из Hyundai секций
02:00:44
спрашивали Можем ли мы управлять при
02:00:46
загрузке следующих элементов Да мы можем
02:00:48
это делать но я думаю что
02:00:52
не получится отобразить список где у нас
02:00:55
1000 элементов 1000 при загруженных
02:00:57
элементов
02:00:59
также есть такой механизм как Snap
02:01:02
Helper это функционал повода скролл
02:01:04
списком Например если мы произвели
02:01:06
изменения данных и мы хотим после
02:01:08
обновления данных вернуться в начало
02:01:10
списка можем использовать Stop Helper
02:01:14
это класс который хранит в себе ссылки
02:01:17
на представления для их при
02:01:20
использовании
02:01:21
основная логика этого класса заключается
02:01:23
в том что мы когда скролим наш список и
02:01:26
хотим показать следующие объекты вот те
02:01:29
View которые мы видим которые появляются
02:01:31
которые появляются при скроле это не
02:01:35
Вновь за flage вьюшки это старое
02:01:38
представление куда мы просто
02:01:41
где мы просто обновляем данные мы просто
02:01:44
с этим просто еще раз вызываем этот
02:01:47
онлайн-вихолдер
02:01:48
с помощью всяких пола мы можем гибко
02:01:51
настраивать этот механизм работы
02:01:57
последующих элементов и
02:02:01
хранением этих элементов сохранение
02:02:03
представлений
02:02:05
и у нас есть
02:02:07
адаптер это расширение базового адаптера
02:02:11
который сразу также используют диффутиль
02:02:13
то есть лист адаптер который
02:02:15
требует который требует переопределения
02:02:18
методов
02:02:20
колбеков диффутиля и тут через важные
02:02:24
замечания что этот адаптер он сравнивает
02:02:26
делает свою работу по сравнению списков
02:02:28
из нового из старого представления на
02:02:32
фоновом потоке Что может быть достаточно
02:02:35
полезным инструментом чтобы это все не
02:02:37
производить собственноручно
02:02:41
также про писатель рвю У нас есть
02:02:44
отдельная лекция 21 года который Также
02:02:47
можно глянуть и получить намного больше
02:02:49
теоретических знаний то сейчас нас
02:02:52
Скорее рассматривалась Скорее
02:02:54
рассматривался рестайкеры со стороны
02:02:56
практики Вот я думаю что там тоже
02:02:59
понравится там очень много теории и
02:03:03
очень много полезной теории
02:03:05
тут можем остановиться ответить на ваши
02:03:07
вопросы но в принципе тоже почти конец
02:03:10
лекции Давайте перейдем к вопросам
02:03:38
mvp здесь означает в плане минимум был
02:03:42
продукт
02:03:43
[музыка]
02:03:45
Зачем нужно делать офсет программно если
02:03:48
можно прописать pading
02:03:50
Да вы правы По 1 в xml можно
02:03:54
проставить для каждого элемента Но в
02:03:58
данном случае мы поставим У нас есть как
02:04:00
бы на примере с чатами У нас есть превью
02:04:03
чатов где мы каждому элементу в списке
02:04:07
проставим соответствующий падинг либо
02:04:09
маржины но тут возникает вопрос Что
02:04:12
делать если у нас
02:04:13
будет патинг в конце списка то есть
02:04:17
заканчивается список и нам не хотелось
02:04:20
бы чтобы у нас снизу был какой-то
02:04:22
промежуток Вот для этого мы можем
02:04:24
задавать паддинги отдельно для каждого
02:04:27
элемента
02:04:30
в чем преимущество использования
02:04:33
перед изменением xml-кода для
02:04:36
отображения айтема
02:04:42
в классе Мы можем
02:04:44
работать с такими абстракциями как канал
02:04:47
то есть мы можем задавать и
02:04:50
прорисовывать определенные фигуры
02:04:51
подрицательным или
02:05:01
в методе есть вопрос про диффутиль в
02:05:06
диффутиль колбеке есть метод getchange
02:05:07
plate для чего он нужен и как его
02:05:10
использовать Вот как раз таки про этот
02:05:13
про этот метод getchange plate он не
02:05:17
является обязательным для переопределения
02:05:19
Вот
02:05:22
про этот метод я рассказал на
02:05:28
слайде про пейлоут Он нам нужен как раз
02:05:31
таки для того чтобы мы могли не
02:05:34
перерендеривать всю вьюшку всю карточку
02:05:37
а для того чтобы могли указать Какие
02:05:39
элементы в этой карточке поменялись
02:05:41
чтобы их
02:05:51
а какие есть альтернативы у
02:05:54
использования ресайтлер View для
02:05:55
построения сложных экранов с разными
02:05:57
элементами например в карточке товара с
02:05:59
подробной информацией в
02:06:01
интернет-магазине
02:06:02
скорее ответ
02:06:05
альтернатив нет У нас есть устаревшие
02:06:09
версии ресакера это listview но
02:06:14
не очень удобен и он уже не
02:06:16
поддерживается писатель View кажется что
02:06:19
это наиболее пригодный хороший вариант
02:06:22
он один но он унифицирован
02:06:33
Я думаю можем заканчивать вопросами и в
02:06:36
целом наша лекция
02:06:38
подходит концу Всем спасибо всем удачи
02:06:42
Приходите на Наши лекции будем рады
02:06:45
здесь есть мой Telegram и ссылочка на
02:06:49
гитхаб и qr-код Если будут вопросы смело
02:06:52
задавайте в Telegram Я постараюсь
02:06:54
ответить всем спасибо

Описание:

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

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Android - View в Android"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Android - View в Android" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Android - View в Android"?mobile menu icon

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

mobile menu iconКак скачать видео "Android - View в Android" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Android - View в Android"?mobile menu icon

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

mobile menu iconКак сохранить кадр из видео "Android - View в Android"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.