Урок 4. Android Material Design. Установка теней и обрезка View
Перевод документации официального сайта developer.android.com
Рисунок 1. Тени для различных высот view.
Чтобы установить высоту view в макете используйте атрибут android:elevation. Чтобы установить высоту в коде activity, используйте метод View.setElevation().
Чтобы установить смещение, используйте метод View.setTranslationZ().
Новые методы ViewPropertyAnimator.z() и ViewPropertyAnimator.translationZ() позволяют легко анимировать высоту view. Для получения дополнительной информации, смотрите справку по ViewPropertyAnimator и руководство разработчика о свойствах анимации.
Вы так же можете использовать StateListAnimator чтобы установить анимации декларативно. Это особенно полезно в тех случаях, когда изменяется состояние триггера анимации, например, когда пользователь нажимает на кнопку. Для получения дополнительной информации, смотрите Изменение состояния анимации view.
Значение Z измеряется в dp (density-independent pixels).
Настройте тени и контуры
Границы фона drawable view определяют форму его тени. Контуры представляют собой внешнюю форму графического объекта и определяют область для сенсорного отклика.
Рассмотрим view, определенное с помощью фона dravable:
Фон drawable определен как прямоугольник с закругленными углами:
View отбрасывает тень с закругленными углами, после того как фон drawable установил границы view. Создание пользовательского контура переопределяет форму тени view по умолчанию.
Чтобы установить пользовательский контур для view в коде:
1. Унаследуйтесь от класса ViewOutlineProvider.
2. Переопределите метод getOutline().
3. Назначьте нового поставщика контура для вашего view с помощью метода View.setOutlineProvider() .
Вы можете создать овальные и прямоугольные очертания с закругленными углами используя методы класса Outlines. Поставщик контура для view по умолчанию получает контур из фона view. Чтобы view не отбрасывала тень, установите значение поставщика контура в null.
Обрежьте view
Обрезание позволяет вам легко изменить форму view. Вы можете обрезать view для совместимости с другими элементами дизайна или изменить форму view в ответ на действия пользователя. Вы можете обрезать view к его области контура с помощью метода View.setClipToOutline() или используя атрибут android:clipToOutline. Только прямоугольник, круг и скругленный прямоугольник поддерживают обрезание, как определено в методе Outline.canClip().
Чтобы обрезать view в форме drawable, установите drawable в качестве фона view (как показано выше), и вызовите метод View.setClipToOutline().
Обрезание view это дорогостоящая операция, поэтому не анимируйте форму, которую вы используете чтобы обрезать view. Для достижения этого эффекта используйте Reveal эффект анимации.
Источник
Как применить тень к ImageView?
Я хочу применить тень к ImageView . Когда я применяю тень к TextView , я получаю его, но он не доходит до ImageView . Как я могу решить эту проблему?
Мы также можем использовать CardView, который обеспечивает закругленный угол фона и тени. Для этого вам необходимо добавить библиотеку v7 CardView в качестве зависимости к проекту в build.gradle, как показано ниже.
Примечание. Измените 23.0.1 в приведенной выше строке с соответствующей версией.
Поэтому я окружил ImageView с помощью CardView чтобы создать тень, как CardView ниже.
Это добавит тень вокруг изображения.
Примечание: я не знаю, хороший ли это обходной путь. Я начинающий. Я попытался реализовать CardView который дает идею реализовать то же самое для этого. Если это не хорошо, пожалуйста, сообщите мне причину.
Это взято из презентации Ромена Гая в Devoxx, в формате pdf здесь.
Надеюсь, что это поможет.
ПРИМЕЧАНИЯ
Не забывайте, что Honeycomb и выше вам нужно вызвать setLayerType(LAYER_TYPE_SOFTWARE, mShadow) , иначе вы не увидите свою тень! (@Dmitriy_Boichenko)
SetShadowLayer , к сожалению, не работает с аппаратным ускорением, что значительно снижает производительность (@Matt Wear)
Ответ, взятый из Здесь
Для Api больше 21.
Вы можете попробовать в xml в imageview или Button: Читайте здесь на сайте разработчика
Создать файл shadow_rect.xml
И используйте это как android: background = “@drawable/shadow_rect в вашем представлении изображений.
Вы можете создать список слоев с возможностью рисования и поместить в него два объекта (чертежи) для изображения и тени.
Позиция теневого элемента и его содержимое могут измениться в зависимости от того, где вы хотите применить тень (верхний, левый, правый, правый и левый и т.д.) и стиль вашей тени.
Для тех, кто хочет загружать большие растровые изображения Эффективно перейдите по этой ссылке: https://developer.android.com/topic/performance/graphics/load-bitmap Это лучший и самый безопасный способ масштабирования изображения на основе устройства.
Тень для круговых изображений
Источник
Удалить тень CardView с одной стороны
Согласно моему требованию к пользовательскому интерфейсу приложения, ему нужна простая сторона поверх cardview, поэтому ему нужно удалить тень с верхней стороны и прикоснуться к другому виду.
но он убрал тень со всех сторон, так что мне это не пригодится.
Я попытался с помощью отрицательного поля (- 5dp) применить к CardView и просмотру изображения один за другим,но все время CardView находится над изображением, а не под изображением, так что это не сработало для меня.
Требование к пользовательскому интерфейсу приложения выглядит следующим образом
Может ли кто-нибудь дать предложения о том, как помочь решить эту проблему?
2 ответа
У меня есть CardView внутри ConstraintLayout . Затем это представление раздувается и добавляется к LinearLayout . Я хотел бы, чтобы CardView бросил тень на следующий CardView , но он, кажется, обрезан ConstraintLayout . Как я могу заставить тень elevation отображаться на CardView , не предоставляя.
Посмотрите на эти изображения: Перед масштабированием После масштабирования Моя проблема в том, что CardView действительно масштабируется, но скрывает тень вида карты. Любой suggestions/ideas. Редактировать : После добавления app:cardUseCompatPadding=true ничего не меняется cardUseCompatPadding.
Я выхожу из этой проблемы, создавая пользовательский фон, похожий на вид карты, но без верхней тени.
Создайте один файл XML в папке drawable, поместите этот код внутрь и установите его в фоновом режиме.
Вот цвет для представления карты
Вы можете достичь такого эффекта, создав другое представление, которое выше, чем cardview по оси z. После этого вам нужно установить его свойство outlineProvider в none , чтобы отключить эффект тени, и поместить его на нужный край CardView.
Похожие вопросы:
Следующий код отлично работает на Kitkat, но shadows не видны в Lollipop. На самом деле я могу видеть тень в предварительном просмотре Android Studio, но не во время работы на device/emulator. я.
Я попытался убрать тень с экрана. Я использовал android support v7 Cardview на android v4.4.2 Мой макет выглядит:
Тень не отображается в CardView
Я разрабатываю приложение android, в котором я использовал cardview в качестве элемента сетки GridView . Я столкнулся с проблемой отображения тени для cardview , если я использую также фоновое.
У меня есть CardView внутри ConstraintLayout . Затем это представление раздувается и добавляется к LinearLayout . Я хотел бы, чтобы CardView бросил тень на следующий CardView , но он, кажется.
Посмотрите на эти изображения: Перед масштабированием После масштабирования Моя проблема в том, что CardView действительно масштабируется, но скрывает тень вида карты. Любой suggestions/ideas.
В Android я использую RecyclerView . Для элемента RecyclerView я использую CardView в качестве макета элемента, а ниже-макет xml:
CardView в сетке не отображает тень со всех сторон
Недавно я отказался от идеи добавления тени к GridView элементам и реализовал CardViews . Проблема, с которой я сталкиваюсь, заключается в следующем: элементы CardView не отображают тени на границах.
(1 скриншот — видимость ImageView видна, 2 скриншота — пропала) При использовании ImageView с CardView мы можем сказать, что тень вообще не видна (особенно на дисплее смартфона).
У меня есть CardView , определенный как
Источник
Изменение цвета тени CardView
Этот вопрос задавали ВО много раз, но все же я не нашел хорошего решения этой проблемы.
Зачем мне это нужно? Хорошо, потому что проект меня и моей команды разрабатывает, имеет стиль iOS.
9.pathch shadow generator, но 9.pathes — это, по существу, png, и это не дает мне никакой гибкости, и если я буду использовать этот подход, я должен редактировать поля везде. Углеродная библиотека поддерживает пользовательские тени, и их рисуют вне границ вида, но есть проблема с закругленными прямоугольниками, когда библиотека не рисует тени для закругленных углов. используя старую реализацию CardView и переориентируя свой теневой цвет, но она нарисована внутри границ карты, поэтому это не вариант.
Итак, есть ли способ изменить теневой цвет CardView с минимальными изменениями всех файлов макета и с теневой тенью вне представления, как это делает оригинальный CardView?
Подумайте об этом в twitter, где Ник Батчер рассказывает о том, как это реализовать:
Для более низких API Ник разделил суть. Вот результат:
Работа по API 21
Этот метод напрямую не связан с CardView , его можно применять к любому View .
Я думаю о простом решении без использования Java или некоторых библиотек. Вы должны сделать Drawable shape и поместить его в папку с возможностью drawable а затем настроить градиент как тень.
Например, в моем решении я добавил два цвета:
Затем я сделал файл и поместил его в папку с возможностью drawable\card_view_shape.xml
Затем оттуда вам нужно обернуть свой вид (который был бы внутри CardView) в контейнере, LinearLayout как LinearLayout затем применить в качестве фона к контейнеру, который вы хотите видеть как вид карты. Чтобы решить эту проблему, добавьте немного заполнения (Thats your shadow) самому контейнеру. Например, проверьте мой:
Затем результаты выглядят так:
Регулировка нижнего отступов будет выглядеть так:
КОММЕНТАРИЙ
Поскольку я не художник, но если вы играете с ним, вы можете заставить все это выглядеть так же, как CardView проверить некоторые подсказки:
- Помещение нескольких градиентов в форму Отрегулируйте конечные цвета градиентов, чтобы они выглядели более сероватыми Конечные цвета также должны быть немного прозрачными Отрегулируйте видимость вида, чтобы выглядеть как тень и цветной, но сероватый Основной фон «Вид» также имеет значение для приведения реальности. Оттуда редизайн формы выглядит еще более реалистично, как CardView .
Источник
Android 4.4 удалить тень из CardView
Я попытался убрать тень с экрана.
Я использовал android support v7 Cardview на android v4.4.2
Мой макет выглядит:
Как вы можете видеть, я использовал:
Пробовал до сих пор:
Но все же вы можете видеть на изображении, которое я прикрепил, верхнюю тень, которая показалась.
3 ответа
Согласно моему требованию к пользовательскому интерфейсу приложения, ему нужна простая сторона поверх cardview, поэтому ему нужно удалить тень с верхней стороны и прикоснуться к другому виду. Я пытался card_view:cardElevation=0dp но он убрал тень со всех сторон, так что мне это не пригодится. Я.
У меня есть CardView внутри ConstraintLayout . Затем это представление раздувается и добавляется к LinearLayout . Я хотел бы, чтобы CardView бросил тень на следующий CardView , но он, кажется, обрезан ConstraintLayout . Как я могу заставить тень elevation отображаться на CardView , не предоставляя.
Просто добавьте код ниже в тег cardview
и не забудьте добавить
UPDATE
Также попробуйте это поместить ниже коды в cardview
app:cardCornerRadius должен быть больше 0(>0), иначе возникнет исключение
Я использую библиотеку поддержки API 28
Вы не можете удалить тень из вида карты в 4.4. Все, что ниже 5.0 высоты, ничего не делает, поэтому все, что находится в 4.4, — это изображение с тенью
Чтобы создать карту с тенью, используйте атрибут card_view:cardElevation. CardView использует реальную высоту и динамические тени на Android 5.0 (API уровень 21) и выше и возвращается к программной теневой реализации в более ранних версиях. Для получения дополнительной информации см. Поддержание Совместимости.
Я просто исправил эту проблему, используя вместо этого относительный макет. Просто измените значение CardView на относительный макет, и вы, по сути, получите тот же результат, но без тени
Похожие вопросы:
Следующий код отлично работает на Kitkat, но shadows не видны в Lollipop. На самом деле я могу видеть тень в предварительном просмотре Android Studio, но не во время работы на device/emulator. я.
Как я могу удалить тень из ImageButton в Android? Что является основным ресурсом, который содержит тень?
Я разрабатываю приложение android, в котором я использовал cardview в качестве элемента сетки GridView . Я столкнулся с проблемой отображения тени для cardview , если я использую также фоновое.
Согласно моему требованию к пользовательскому интерфейсу приложения, ему нужна простая сторона поверх cardview, поэтому ему нужно удалить тень с верхней стороны и прикоснуться к другому виду. Я.
У меня есть CardView внутри ConstraintLayout . Затем это представление раздувается и добавляется к LinearLayout . Я хотел бы, чтобы CardView бросил тень на следующий CardView , но он, кажется.
В Android я использую RecyclerView . Для элемента RecyclerView я использую CardView в качестве макета элемента, а ниже-макет xml:
CardView в сетке не отображает тень со всех сторон
Недавно я отказался от идеи добавления тени к GridView элементам и реализовал CardViews . Проблема, с которой я сталкиваюсь, заключается в следующем: элементы CardView не отображают тени на границах.
(1 скриншот — видимость ImageView видна, 2 скриншота — пропала) При использовании ImageView с CardView мы можем сказать, что тень вообще не видна (особенно на дисплее смартфона).
Я работаю с CardView в android. Я пытаюсь дать угловой радиус CardView . Я могу сделать это из XML. Код работает ожидаемым образом в Lollipop и выше, но на устройствах android 4.4 я не вижу.
У меня есть CardView , определенный как
Источник