тех, которые появились в 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
Мобильная версия