Как мы можем исправить дефект тени материала на прозрачных/полупрозрачных составных объектах?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»