тех, которые появились в Material Design и его концепциях поверхностей, освещения
и высоты. Кроме того, если вы не знали, Compose использует многие из тех же
графических API, что и платформа View, включая те, которые отвечают за упомянутые
тени, поэтому у него тот же глюк, что и у View< /code>по крайней мере на данный момент.

Это FloatingActionButton, ExtendedFloatingActionButton и карточка код>
с полупрозрачным фоном, показывающим дефект.
По причинам, о которых я не буду здесь рассказывать,* я не буду считаю, что существует
какое-либо правильное решение этой проблемы – т. е. я не думаю, что платформа предлагает какой-либо
метод или конфигурацию, с помощью которой можно было бы вырезать или иным образом удалить этот артефакт –
поэтому мы остались обходные пути. Кроме того, основным требованием является то, чтобы
тени выглядели точно так же, как обычно выглядят на платформе, поэтому любой метод,
рисующий тени с помощью других методов, таких как равномерный градиент, размытие или что-то еще,
является неприемлемо.
Учитывая это, можем ли мы создать надежное, общеприменимое решение в Compose?
Лично я остановился на общем подходе, заключающемся в отключении исходная тень и
рисование обрезанной копии на своем месте. (Я понимаю, что просто пробить
дырку в ней - это не то, как тени работают реалистично, но, похоже, это
в основном ожидаемый эффект.) Я поделился примером версии Compose
это в ответе ниже, но основная мотивация для этого вопроса заключалась в том, чтобы
проверить наличие лучших идей, прежде чем помещать их в библиотеку.
Я уверен, что есть технические детали в моем примере, которые можно улучшить,
но меня в основном интересуют принципиально разные подходы или предложения.
Мне не интересно, например, как-то использовать drawBehind() или Canvas
вместо этого по сути сделайте то же самое или выполните рефакторинг параметров только для размещения
контента и т. д. Я думаю больше в духе:
- Можете ли вы придумать другой (более эффективный) способ обрезать этот артефакт? без
создания и обрезки отдельного теневого объекта? При использовании View я нашел почти единственный
способ — нарисовать View дважды, обрезав содержимое в одном отрисовке
и отключив тень в другом. В конце концов я отказался от этого,
но, учитывая накладные расходы. - Можно ли это извлечь в модификатор и расширение, аналогичное
*GraphicsLayerModifier иshadow()/полупрозрачность/прозрачность, поэтомуКод: Выделить всё
graphicsLayer()? Я еще не до конца осмыслил все концепции и возможности Compose, но так не думаю. < li>Есть ли другой способ сделать это общеприменимым, не требуя дополнительной проводки? Теневой объект в моем примере зависит от трех необязательных параметров со значениями по умолчанию из целевого составного объекта, и я не могу придумать никакого способа получить их, кроме как обернуть цель другим составным объектом.< /p> [/list] * Эти причины изложены в мой вопрос здесь. [b]Уточнения[/b]: [list] [*]Необходимо сохранить Composable
мы все еще можем видеть, что за этим стоит. Установка непрозрачного цвета фона здесь
не работает. Артефакт необходимо исправить, а не просто закрыть.
Если для вашей конкретной настройки подойдет непрозрачный цвет, например, если
основной контент представляет собой один сплошной цвет – вы можете просто использовать
функцию Color#compositeOver(), чтобы определить непрозрачный цвет, который
получится в результате смешивания полупрозрачного цвета с цветом, находящимся за ним. - Этот вопрос конкретно касается материальных теней, которые
отбрасываются объектами Views/, которые взаимодействуют с процедурой рисования на экранеКод: Выделить всё
RenderNode
и ее моделью освещения с двумя источниками. Слой тени android.graphics.Paint — это отдельный механизм, который не взаимодействует с этой моделью и
поэтому не генерирует материальные тени. Это просто рисование статического,
равномерного градиента, который здесь отмечен выше как неприемлемый, поскольку он
выглядит совершенно иначе, чем тени материала.
Если Paint подойдет для вашей конкретной настройки,
на сайте уже доступно множество примеров, например, по
этому вопросу. Повторять их здесь нет необходимости.
Подробнее здесь: https://stackoverflow.com/questions/718 ... omposables
Мобильная версия