Как мы можем исправить дефект тени материала на прозрачных/полупрозрачных составных объектах?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как мы можем исправить дефект тени материала на прозрачных/полупрозрачных составных объектах?

Сообщение Anonymous »

Если вы еще не знали, существует дефект в материальных тенях Android,
тех, которые появились в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»