Как сделать закругленный relativelayout
Как сделать в Android с закругленными углами
вот что я сделал, определите drawable как указано ниже
теперь я использовал это в качестве фона для моего макета, как показано ниже
это работает отлично, я вижу, что вид имеет закругленные края.
но мой макет имеет много других дочерних представлений в нем, скажем, ImageView или MapView. Когда я помещаю ImageView внутри вышеуказанного макета, углы изображения не обрезаются/обрезаются, вместо этого он кажется полным.
Я видел другие обходные пути, чтобы заставить его работать, как пояснил здесь.
но есть ли способ установить закругленные углы для вида и всех его вид ребенка, содержащихся в основной вид, скругленные углы?
15 ответов
другой подход заключается в создании пользовательского класса макета, подобного приведенному ниже. Этот макет сначала рисует свое содержимое на экранном растровом изображении, маскирует экранное растровое изображение округлой прямой линией, а затем рисует экранное растровое изображение на фактическом холсте.
я попробовал, и это, кажется, работает (по крайней мере, для моего простого testcase). Это, конечно, повлияет на производительность по сравнению с обычным макетом.
используйте это как обычный макет:
и внутри вас макет
или вы можете использовать android.support.v7.widget.CardView вот так:
Если у вас возникли проблемы при добавлении касания слушателей к макету. Используйте этот макет как родительский.
создать XML-тура.xml в папке drawable
затем используйте round.XML в качестве фона для элементов..Тогда это даст закругленные углы
В Android L вы сможете просто использовать вид.setClipToOutline чтобы получить этот эффект. В предыдущих версиях нет способа просто обрезать содержимое случайной ViewGroup в определенной форме.
вам придется подумать о чем-то, что даст вам аналогичный эффект:
Если вам нужны только закругленные углы в ImageView, вы можете использовать шейдер для «рисования» изображения над формой, которую вы используете в качестве фона. Взгляните на библиотека для примера.
Если вам действительно нужно, чтобы каждый ребенок был обрезан, может быть, вы можете еще один вид над вашим макетом? Один с фоном любого цвета, который вы используете, и круглой «дырой» посередине? Фактически можно создать пользовательскую ViewGroup, которая рисует эту фигуру над каждым дочерним элементом, переопределяющим метод onDraw.
ответ Яапа Ван Хенгстума отлично работает, однако я думаю, что это дорого, и если мы применяем этот метод к кнопке, например, сенсорный эффект теряется, так как представление отображается как растровое изображение.
для меня лучший и самый простой метод заключается в применении маски к представлению, например:
согласно этому сообщению, написанному Гаем Роменом, одним из ведущих разработчиков всего инструментария Android UI, можно сделать контейнер (и все его дочерние представления) с закругленными углами, но он объяснил, что это слишком дорого (от выступлений рендеринга вопросы.)
я порекомендую вам идти в соответствии с его постом, и если вы хотите закругленные углы, а затем реализовать закругленные углы ImageView согласно этому сообщению. затем вы можете поместить его в контейнер с любым фоном, и вы получите желаемый эффект.
это то, что я тоже сделал в конце концов.
предоставленная вами ссылка учебника, похоже, предполагает, что вам нужно установить свойства layout_width и layout_height ваших дочерних элементов в match_parent.
попробуйте это свойство с вашей линейной компоновкой, это поможет
инструменты:контекст=».youractivity»
отличие от ответа Jaap van Hengstum:
на CardView работал для меня в API 27 В Android Studio 3.0.1. The colorPrimary была ссылка в res/values/colors.xml file и является просто примером. Для layout_width 0dp он будет растягиваться до ширины родителя. Вам нужно будет настроить ограничения и ширину / высоту в соответствии с вашими потребностями.
используйте shape в xml с прямоугольником.установите свойство bottom или upper radius как хотите.затем примените этот xml в качестве фона к представлению ur. или. использовать градиенты, чтобы сделать это из кода.
Скругление углов в Android. Быстро, качественно, недорого.
Довольно часто при разработке мобильных приложений требуется придавать содержимому некую форму, например, сделать круглое изображение для аватарки. Если для статичных элементов (ImageView) можно обойтись таким инструментом как Picasso transformation, то для динамического содержимого дела обстоят сложнее. Например, есть список элементов, который можно прокручивать и нужно закруглить края. Для этого вполне может подойти виджет CardView.
Но что если нужно задать форму отличную от прямоугольника, и при этом эта форма будет динамически меняться? Это и потребовалось сделать в одном из наших проектов. Подходящих стандартных компонентов UI для данных целей не нашлось, что сподвигло меня на исследование, какие вообще есть инструменты Android для придания формы контенту.
Статья длинная — для тех, кому лень читать всё, самое важное и исходный код в конце статьи.
Дизайнерская верстка
В нашей компании работают довольно креативные дизайнеры. Их безумные идеи порой могут озадачить даже самого опытного разработчика. Посмотрим, что на этот раз нам приготовили.
У нас есть некая карточка с содержимым, которое может прокручиваться. У карточки есть закругление верхних углов, нижние углы должны быть прямыми. Карточку можно потянуть вверх, и, когда карточка заполняет весь экран, закругление убирается.
Все просто, на первый взгляд.
Протоптанная дорожка
На первый взгляд, можно использовать виджет CardView, но в процессе разработки был выявлен ряд недостатков:
Тернистый путь
Итак, стандартный виджет нам не подходит. Придется искать подходящее решение и писать инструмент самостоятельно. А для начала разобраться, какие есть возможности в этом направлении у других Android инструментов.
Критерии для реализации инструмента:
Это, конечно, был бы универсальный инструмент. В вариантах, которые я исследовал, не все критерии соблюдаются, но для реализации части случаев вполне подходят.
Я попробовал 4 различных варианта:
Свойство View.clipToOutline
Этот подход используется в виджете CardView. Глянем, что он умеет.
Как это работает:
Задаем фоновое изображение нужной формы и выставляем в поле View.clipToOutline значение “true”.
Но мы знаем, что работаем с API Android, и слишком легко, чтобы быть правдой. Смотрим документацию метода View.setClipToOutline()
Sets whether the View’s Outline should be used to clip the contents of the View…Note that this flag will only be respected if the View’s Outline returns true from Outline.canClip()
Returns whether the outline can be used to clip a View. Currently, only Outlines that can be represented as a rectangle, circle, or round rect support clipping.
Получается, что пока доступен ограниченный набор форм. Вот так, задумка хорошая, но возможности не позволяют реализовать весь полет фантазий.
Для того, чтобы динамически менять форму фонового изображения, можно создать класс, наследованный от Drawable. В методе getOutline() задаем нужный контур.
Хорошо подходит для ситуации, когда нужно задать форму прямоугольника, овала и прямоугольника со скругленными краями, при условии, что приложение разрабатывается для версий Android Lollipop и выше. Возможно, в будущем появится поддержка любой формы контура, но это в будущем.
Метод Canvas.clipPath() при отрисовке дочерних элементов в контейнере
Данный подход состоит в наследовании от класса контейнера. В методе dispatchDraw() делаем обрезку по нужной форме с помощью метода Canvas.clipPath()
Подход относительно прост в реализации и подойдет для случаев, когда требуется быстро добавить в проект необходимую функциональность, а сглаживание линий непринципиально.
Метод Canvas.drawPath() при отрисовке дочерних элементов в контейнере, View.LAYER_TYPE_SOFTWARE
Соответственно, данная настройка ведет к падению производительности. Но насколько это критично, видно на графике производительности.
В процессе тестирования выяснилось, что перестают работать такие вещи как тень у кнопки. Похоже, проблема именно в View.LAYER_TYPE_SOFTWARE.
Метод Canvas.drawPath() при отрисовке дочерних элементов в контейнере, View.LAYER_TYPE_HARDWARE
Как это выглядит в реализации:
Для решения проблемы с закруглением углов в нашем проекте мы использовали данный метод. Избавились от мерцания при переходе между экранами, создав для каждого экрана свой контейнер. Это сказалось на производительности при смене экранов, но не критично и практически незаметно, так как переход занимает менее секунды.
Схематично было так:
Extra
Получив достаточно информации по методам отсечения в Android, хочется проверить, как это работает с изменяемой формой в виде анимации. За основу анимации взял следующее: трансформация звезды в многоугольник и обратно в звезду. Все это вращается вокруг своего центра. Посмотрим, что получилось и как это влияет на производительность.
Метод PorterDuff.Mode + View.LAYER_TYPE_HARDWARE
Метод Canvas.clipPath()
Мнение автора
Каждый из подходов хорошо применим в определенной ситуации.
Ух, это была довольно большая статья. Кто дочитал, тому виртуальный приз 🍬
Удачного кода, меньше багов, больше счастливых пользователей!
Как сделать ImageView с закругленными углами?
В Android ImageView по умолчанию является прямоугольником. Как я могу сделать его закругленным прямоугольником (обрезать все 4 угла моего растрового изображения, чтобы быть закругленными прямоугольниками) в ImageView?
30 ответов
Это довольно поздно в ответ, но для тех, кто ищет это, вы можете сделать следующий код вручную по углам ваших изображений.
Это не мой код, но я использовал его и он работает прекрасно. Я использовал его в качестве помощника в классе ImageHelper и немного расширил его, чтобы передать количество перьев, необходимое для данного изображения.
окончательный код выглядит следующим образом это:
надеюсь, это кому-то поможет!
в то время как вышеуказанный ответ работает, Romain Guy (основной разработчик Android) показывает лучший метод в своем блоге, который использует меньше памяти, используя шейдер, не создавая копию растрового изображения. Общая суть функциональности здесь:
преимущества этого над другими методами в том, что он:
Я создал RoundedImageView на основе этого кода, который обертывает эту логику в ImageView и добавляет правильная ScaleType поддержка и необязательная закругленная граница.
в v21 библиотеки поддержки теперь есть решение этого: это называется RoundedBitmapDrawable.
это в основном так же, как обычный Drawable, за исключением того, что вы даете ему радиус угла для обрезки с:
еще один простой способ-использовать CardView с радиусом угла и ImageView внутри:
вырезка на округлые формы была добавлена в View класс в API 21.
просто сделать это:
res/drawable / round_outline.в XML
к сожалению, нет ошибка и этот атрибут XML не признал. К счастью, мы все еще можем настроить отсечение на Java:
вот как это будет выглядеть:
Примечание:
этот метод работает для любой drawable форма (не только округлые). Это будет клип в ImageView для любой формы контура заданы в Катры в формате XML.
специальное примечание об ImageViews
setClipToOutline() работает только тогда, когда фон представления установлен на фигуру drawable. Если эта фоновая фигура существует, представление рассматривает контур фигуры как границы для обрезки и затенения.
это означает, если вы хотите использовать setClipToOutline() чтобы закруглить углы на ImageView, ваше изображение должно быть установлено с помощью android:src вместо android:background (так как фон должен быть установлен на вашу округлую форму). Если вы должны использовать фон для установки изображения вместо src, вы можете использовать этот обходной путь:
я обнаружил, что оба метода были очень полезны в разработке рабочего решения. Вот моя составная версия, которая не зависит от пикселей и позволяет вам иметь некоторые квадратные углы с остальными углами, имеющими одинаковый радиус (что является обычным случаем использования). Благодаря обоим вышеперечисленным решениям:
кроме того, я перешел ImageView, чтобы поместить это, чтобы я мог определить его в xml. Возможно, вы захотите добавить немного логики, которую здесь делает super call, но я прокомментировал это как это не полезно в моем случае.
надеюсь, что это помогает!
округленное изображение с помощью ImageLoader здесь
или вы можете пользователей Picasso библиотека с площади.
вы можете скачать файл RoundedTransformation здесь здесь
Я сделал по пользовательскому ImageView:
выход:
надеюсь, это поможет вам.
поскольку все ответы казались слишком сложными для меня только для круглых углов, я подумал и пришел к другому решению, которое, я думаю, стоит поделиться, просто с XML, если у вас есть пространство вокруг изображения:
создайте граничную форму с прозрачным содержимым, например:
затем в RelativeLayout вы можете сначала поместить свое изображение, а затем в том же месте над формой с другим ImageView. Форма крышки должна быть больше по размеру на величину ширины границы. Будьте осторожны, чтобы взять больший радиус угла, поскольку внешний радиус определен, но внутренний радиус-это то, что покрывает ваше изображение.
надеюсь, что это тоже кому-то поможет.
редактировать в соответствии с запросом CQM пример относительного макета:
моя реализация виджет ImageView с закругленными углами, что (вниз|вверх)размеры изображения до нужных размеров. Он использует кодовую форму CaspNZ.
вы должны продлить ImageView и нарисуйте свой собственный закругленный прямоугольник.
если вы хотите рамку вокруг изображения, вы также можете наложить округлую рамку поверх представления изображения в макете.
Я знаю, что этот поток немного стар, но его один из лучших результатов для запросов на Google для того, как округлить углы ImageViews на Android.
Ромен Гай, где он находится.
уменьшенная версия выглядит следующим образом.
ниже создается объект макета закругленного прямоугольника, который рисует закругленный прямоугольник вокруг любых дочерних объектов, помещенных в него. Он также демонстрирует, как создавать представления и макеты программно без использования XML-файлов макета.
класс для объекта макета RoundedRectangle определен здесь:
почему бы не обрезать в draw ()?
большое спасибо за первый ответ. Здесь изменена версия для преобразования прямоугольного изображения в квадратное (и округленное), а цвет заливки передается в качестве параметра.
Drawable. Фигуры и градиенты
Shape и ShapeDrawable
Фигуры являются подмножеством Drawable-ресурсов.
Имя файла без расширения будет служить идентификатором (ID): R.drawable.filename в Java-коде и @[package:]drawable/filename в XML-файлах.
Элементы фигуры
rectangle (Прямоугольник)
Пример с градиентным прямоугольником в качестве разделителя
Создадим файл separator.xml:
В разметке приложения добавим код:
У прямоугольников можно скруглить углы при помощи тега corners
Можно закруглить углы по отдельности:
oval (Эллипс)
Другой вариант с пунктиром:
ring (Кольцо)
innerRadius Внутренний радиус innerRadiusRatio Отношение между внешним и внутренним радиусами. По умолчанию равно 3 thickness Толщина кольца (т.е. разница между внешним и внутренним радиусами) thicknessRatio Отношение ширины кольца к его толщине. По умолчанию равно 9
line (Горизонтальная линия)
Градиенты: gradient и GradientDrawable
Тег gradient (класс GradientDrawable) позволяет создавать сложные градиентные заливки. Каждый градиент описывает плавный переход между двумя или тремя цветами с помощью линейного/радиального алгоритма или же используя метод развертки.
Тег gradient внутри тега shape. Основные атрибуты: type, startColor (обязателен), endColor (обязателен) и middleColor (необязателен). Также иногда оказывается полезным атрибут centerColor.
Используя атрибут type, вы можете описать свой градиент:
linear
Также можно задействовать атрибуты centerX и centerY.
radial
Интересный эффект получается при использовании множества радиальных градиентов.
sweep
Рисует развёрточный градиент с помощью перехода между цветами startColor и endColor вдоль внешнего края фигуры (как правило, кольца).
Можно использовать атрибуты android:centerX и android:centerY.
Попробуйте также такой вариант.
А почему бы не повращать?
Примеры с shape
Закругляем уголки у компонентов
Создадим отдельный файл res/drawable/roundrect.xml и с его помощью скруглим уголки у LinearLayout, ImageView, TextView, EditText:
В разметке активности пишем следующее:
Овальный кабинет
В Белом доме есть Овальный кабинет. Если вам придётся писать приложение для администрации президента США, то все элементы нужно сделать овальными. Создадим файл res/drawable/oval.xml:
Заменим в предыдущем примере android:background=»@drawable/roundrect» на android:background=»@drawable/oval».