2018 Обновление
За последние 7 лет многое изменилось.
Лучший способ справиться с этим типом макета в наши дни - использовать CardView
, который имеет встроенную поддержку закругленных углов и многие другие новые функции пользовательского интерфейса.
Примените свойство cardCornerRadius
, чтобы углы были округлены.
<android.support.v7.widget.CardView
.......
app:cardCornerRadius="16dp">
</android.support.v7.widget.CardView>
Оригинал
Мне были нужны округлые макеты в стиле iPhone с серым фоном за ними. (вздыхает - всегда копирую айфон)
Я был разочарован, я не мог найти способ замаскировать макет. Большинство ответов здесь говорят об использовании фонового изображения, но это не то, что мне было нужно.
Редактировать : В предыдущем ответе предлагалось использовать FrameLayout
и установить рисование android:foreground
. Это ввело некоторую странную прокладку в вид. Я обновил свой ответ, чтобы использовать более простую технику RelativeLayout
.
Хитрость заключается в использовании RelativeLayout
; поместите ваш макет внутри него.
Под макетом добавьте еще один ImageView
, установив его background
в подходящую рамку маскирующего изображения. Это нарисует это поверх вашего другого макета.
В моем случае я создал файл 9Patch на сером фоне с вырезанным из него прозрачным скругленным прямоугольником.
Это создает идеальную маску для вашего основного макета.
XML-код приведен ниже - это обычный XML-файл макета:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="fill_parent">
<!-- this can be any layout that you want to mask -->
<LinearLayout android:id="@+id/mainLayout"
android:layout_height="wrap_content"
android:layout_width="fill_parent" android:orientation="vertical"
android:background="@android:color/white">
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_gravity="center"
android:text="Random text..." />
</LinearLayout>
<!-- FRAME TO MASK UNDERLYING VIEW -->
<ImageView android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:background="@drawable/grey_frame"
android:layout_alignTop="@+id/mainLayout"
android:layout_alignBottom="@+id/mainLayout" />
</RelativeLayout>
Обратите внимание на ImageView
внизу, выровненные сверху и снизу к основному макету с установленным маскирующим изображением:
android:background="@drawable/grey_frame"
Это ссылается на мой файл 9Patch - и маскирует базовый макет, рисуясь на переднем плане.
Вот пример, показывающий серые закругленные углы поверх стандартного макета.
НТН