Тень объекта android studio

Урок 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 эффект анимации.

Источник

Как показать тень вокруг linearlayout в android?

Как я могу показать тень для моего линейного макета. Я хочу белый цвет округлый фон с тенью вокруг linearlayout. Я делал это до сих пор. Пожалуйста, помогите мне. Спасибо заранее.

Читайте также:  Не грузятся файлы андроид

и rounded_rect_shape.xml в каталоге xml

13 ответов

в Android нет такого атрибута, чтобы показать тень. Но возможные способы сделать это:

добавьте простой LinearLayout с серым цветом, над которым добавьте свой фактический макет, с полем внизу и справа, равным 1 или 2 dp

есть 9-патч изображение с тенью и установить его в качестве фона для вашего линейного макета

существует также другое решение проблемы путем реализации списка слоев, который будет выступать в качестве фона для LinearLayoout.

добавить background_with_shadow.xml-файл в res/drawable . Содержащий:

затем добавьте список слоев в качестве фона в LinearLayout.

Ну, это легко достичь .

просто построить GradientDrawable это происходит от Черного и переходит к прозрачному цвету, чем использовать родительские отношения, чтобы поместить вашу форму близко к представлению, которое вы хотите иметь тень, тогда вам просто нужно дать любые значения высоте или ширине .

вот пример, этот файл должен быть создан внутри res/drawable , Я называю это как shadow.xml :

поместите следующий код выше из LinearLayout , например, установите android:layout_width и android:layout_height to fill_parent и 2.3dp , вы будете иметь хороший эффект тени на LinearLayout .

Примечание 1: если вы увеличиваете android:layout_height будет показано больше тени .

примечание 2: использовать android:layout_above=»@+id/id_from_your_LinearLayout» атрибут если вы размещаете этот код внутри RelativeLayout, в противном случае игнорируйте его.

надеюсь, это поможет кто-то.

для леденца и выше вы можете использовать высота.

для более старых версий:

(toast_frame не работает на KitKat, тень была удалена из тостов)

Источник

Как создать тень для кнопки

Как вы можете видеть на картинке, я хочу, чтобы тень за Button . Я создал Button с закругленными углами. Но проблема в том, что я не могу создать тень за этой Button . Как я могу это достичь?

И в вашем XML-макете:

Для Android версии 5.0 и выше

Попробуйте Elevation для других видов.

Ниже версии 5.0,

Для всех просмотров,

Если вы нацеливаете устройства до Lollipop, вы можете использовать Shadow-Layout , так как это легко, и вы можете использовать его в разных типах макетов.

Добавьте теневой макет в файл Gradle :

В верхней части xml-макета, где у вас есть кнопка, добавьте вверху :

Он предоставит пользовательские атрибуты.

Затем вы помещаете вокруг себя макет тени. Button :

Затем вы можете настроить параметры app: в соответствии с вашей теневой тенью.

Здесь моя кнопка с тэгом «cw_button_shadow.xml» под возможностью рисования

Моя кнопка xml, размер вашей высоты и веса

Я пробовал код сверху и сделал свою собственную тень, которая немного ближе к тому, чего я пытаюсь достичь. Может быть, это тоже поможет другим.

Источник

Как добавить тень над видом в Android

У меня есть представление о сервере в качестве нижнего колонтитула. Это просто представление, которое вы можете рассматривать как кнопку, текстовое представление или макет (на самом деле я открыт для всего). Вот xml

Итак, как вы можете видеть, ScrollView прокручивается под MyBottomView. Я хочу добавить верхнюю тень к MyBottomView, чтобы он больше походил на Material Design. Как я могу это сделать?

3 ответа

Вот несколько решений этой проблемы — выберите лучшее:

  • В StackOverFlow в сообщении от 22 октября 2012 г. Как отображать тень вокруг linearlayout в android? вы бы прочитали:

В Android нет такого атрибута, чтобы показать тень. Но возможные способы сделать это:

Добавьте простой LinearLayout серого цвета, поверх которого добавьте фактический макет с полями внизу и справа, равными 1 или 2 dp

Читайте также:  Мой говорящий том бег за золотом для андроид

Создайте изображение из 9 участков с тенью и установите его в качестве фона для вашего линейного макета

Существует также другое решение проблемы путем реализации списка слоев, который будет служить фоном для LinearLayoout.

Добавьте файл background_with_shadow.xml в res/drawable . Содержит:

Затем добавьте список слоев в качестве фона в свой LinearLayout.

  • Еще одно сообщение от StackOverflow, как установить тень для представления в android ?, дает другое решение (с использованием двух представлений, образующих тень):
  • Вы также можете использовать определенные ресурсы Android для имитации эффекта тени. Посмотрите: https://stackoverflow.com/questions/21211870/android-view-shadow или просто прочтите сообщение ниже:

Я использую Android Studio 0.8.6 и не могу найти:

поэтому я нашел это вместо этого:

и это выглядит так:

! [введите описание изображения здесь] [1]

Если вас интересует чистый эффект материального дизайна, прочтите документацию, как показано ниже:

На взломе я обнаружил, что для этого нужно обернуть ваше представление в родительский элемент и использовать поворот. Например. если у вас есть вид карты и вы добавляете к нему высоту, вы можете поставить два поворота, как это, чтобы получить тень сверху, а не снизу:

Это дает что-то вроде прилагаемого снимка экрана.

С этим все еще есть проблема — для этого требуется, чтобы paddingBottom был установлен в родительском макете, что означает, что будет очевидно, что любой прокручиваемый брат над макетом не уходит ниже него.

Так что даже в наш век поставщиков возвышений и контуров лучше вместо этого добавить полупрозрачный вид. 🙁

Если вам нужна тень только с одной стороны вида (например, сверху), вы можете добавить еще один вид перед ним и использовать градиентную тень для его фона.

Вот файл градиента top_shadow_gradient.xml , который вы должны сохранить в папке drawable :

И вот пример макета, как его использовать:

Важно: корневой макет должен быть прозрачным ( android:background=»@android:color/transparent» ), а макет «содержимого» должен иметь белый фон ( android:background=»#ffffff» ).

Источник

Google Android — это несложно

Добро пожаловать на форум сайта

Тень для картинки в ImageView

Тень для картинки в ImageView

Сообщение sergey_korovin » 15 июл 2015, 18:39

Столкнулся с такой проблемой: есть приложение — галерея. При клике по картинке в галерее открывается новое activity, в котором расположен ImageView, масшатабирующий картинку на весь экран.

Вот layout activity:

Есть ли какой-нибудь способ нарисовать для картинки в ImageView — тень?
Можно, конечно, добавить для ImageView — android:background=»@android:drawable/dialog_holo_light_frame»,
но размер самого imageView больше, чем размер картинки, поэтому это не работает.
И размер ImageView, если я правильно понимаю, менять нельзя, так как требуется масштабирование разных по размеру картинок.

Нельзя ли как-нибудь на лету «пририсовывать» к картинке тень и уже потом устанавливать ее (setImageResource) в ImageView?

Заранее благодарю за ответы!

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 00:02

Читайте также:  Retrofit android java пример

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 17:23

Фактически, есть два варианта:

1. Поставить для ImageView — height и width = ‘wrap_content’. Тогда тень рисуется вокруг imageView и самой картинки (их размеры совпадают) — без проблем.
Но тогда возникают проблемы с масштабированием. Маленькие картинки уже не растягиваются на весь экран.

2. Просто отказаться от тени и сделать у активити полупрозрачный затемненный фон, на котором отображается ImageView.

Вы, видимо предлагаете второй вариант.

Этот второй вариант уже используется, то есть полупрозрачный фон и так есть. Но все-равно просится еще и более темная тень под картинку. Без нее не так красиво. У ImageView можно сделать margin скажем 20dip и тень была бы видна.

Возможно есть и третий вариант — картинку открыть в Bitmap и там на лету нарисовать ей тень, а потом уже битмап подать в ImageView. С этим пока не разобрался.

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 18:19

Нет, я говорил о первом варианте. Если я правильно понял проблему то тебе надо в атрибутах ImageView дописать/изменить следующее:

android:layout_width=»match_parent»
android:layout_height=»wrap_content»
android:adjustViewBounds=»true»
android:background=»@android:drawable/dialog_holo_light_frame»

+отступы и центрирование по желанию и самостоятельно. Так картинка будет и растягиватся в рамках допустимого и тень будет ровно под ней.

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 19:28

Re: Тень для картинки в ImageView

Сообщение Sasha2dx » 18 июл 2015, 19:57

Ну. я же написал выше. Один параметр надо оставить match_parent, второй изменить на wrap_content. (что бы они не были одинаковыми), тогда изображение растягивается, например, по ширине вьюшки, а высота вьюшки подгоняется под контент из за параметра adjustViewBounds.

Какой параметр куда ставить — зависит от пропорций показываемых изображений и положения экрана(ландшафтный или портретный).

upd
А, и вот ещё вспомнил, у ImageView есть атрибут scaleType, можно выставить статичные размеры для вью и scaleType=»centerCrop», тогда изображение будет подгоняться к размерам вьюшки, а края которые не умещаются — будут обрезаться. Тогда размеры вью всегда будут одинаковыми, а изображение будет подгоняться.

Re: Тень для картинки в ImageView

Сообщение sergey_korovin » 18 июл 2015, 20:20

Да, я уже попробовал Спасибо за идею, работает, действительно — в зависимости от ориентации экрана меняю комбинацию match — wrap на wrap — match.
Все красиво работает, когда контейнером для ViewImage служит FrameLayout. Но в нем не получается отцентрировать картинку.
В RelativeLaout можно отцентрировать, но там почему-то не работает adjustViewBounds при landscape ориентации — остаются небольшие полосы ( в вертикальной — нормально работает).
Видимо здесь и придется использовать centerCrop.

Удалось отцентрировать картинку во FrameLayout. Дело в том, что при смене layout params сбрасывается и гравити.
Установил его динамически так: layoutParams.gravity = Gravity.CENTER;

И что интересно — простое отслеживание ориентации экрана работает одинаково для картинок с разным aspect ratio. Тое сть и длинные, и широкие картинки отображаются простой сменой комбинации match — wrap на wrap — match.

В общем, все работает. Большое спасибо за помощь!

Источник

Оцените статью