Jetpack Compose, похоже, специализируется на пользовательском интерфейсе, который автоматически позиционируется и измеряется относительно остальной части пользовательского интерфейса, без необходимости знать его точный размер. Во многих случаях это здорово, но у меня есть несколько приложений, в которых мне нужен компонуемый объект для рисования с точными координатами и размерами пикселей. Мне также нужно отслеживать ввод указателя на составной элемент в процентах от его размера.

Конкретный случай, над которым я сейчас работаю, — это отображение клавиатуры фортепиано, показанной на рисунке, где каждая клавиша должна иметь размер и располагаться в определенных позициях относительно клавиатуры в целом. Кроме того, мне нужно отслеживать указатели на клавиатуре и рассчитывать, какие клавиши нажимаются. В настоящее время я реализую это, используя компонуемый Canvas. Полезно, что холст предоставляет вам свой размер, но я не могу использовать этот размер за пределами холста для отслеживания ввода указателя. На данный момент это мой план.
переменная ширина по памяти {mutableStateOf(0) } высота переменной, запомнив {mutableStateOf(0)} Холст(модификатор = модификатор .background(Цвет.Черный) .pointerInput(ширина, высота) { awaitPointerEventScope { /* отслеживаем указатели и вычисляем, какие клавиши нажимаются с использованием значений ширина и высота */ } }.onSizeChanged { ширина = it.ширина высота = it.height } ) { /* рисуем клавиши фортепиано, используя значения размера.ширины и размера.высоты по размеру и расположите их */ } Мои вопросы:
[*]Использование модификатора .onSizeChanged для отслеживания размера кажется неудобным. Есть ли способ лучше? Я также обеспокоен тем, что такой подход приведет к ошибкам, когда область pointerInput будет отменена и перезапущена при изменении размера, что может привести к потере некоторых событий указателя. [*]Приемлемо ли вообще отображать более крупный компонент пользовательского интерфейса, например клавиатуру фортепиано, полностью используя холст? У меня будет анимация для нажатия клавиш, а использование холста означает, что вся клавиатура будет перерисовываться в каждом кадре анимации. Часто ли вручную реализуют какой-то буфер или кэширование, чтобы избежать перерисовки компонентов, или же набор простых фигур рисуется настолько быстро, что это вообще не имеет значения?
Мобильная версия