Android XML закругленные обрезанные углы
Я установил LinearLayout со следующим фоном рисования:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp" />
<solid android:color="#CCFFFFFF"/>
</shape>
Проблема у меня в LinearLayout У меня есть еще один элемент LinearLayout, который находится в нижней части своего родителя. Поскольку это не имеет закругленных углов, его углы проходят мимо нижнего левого и правого углов родителей.
Нарисованный фон на Child LinearLayout выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/pedometer_stats_background"
android:tileMode="repeat"
/>
Проблема выглядит следующим образом: http://kttns.org/hn2zm на устройстве отсутствие отсечения является более очевидным.
Каков наилучший метод для отсечения?
3 ответа
Что ваше описание звучит так:
<LinearLayout android:shape="rounded">
<LinearLayout android:background="@drawable/pedometer_stats_background">
</LinearLayout>
</LinearLayout>
И внутреннее расположение выдвигает за пределы закругленных углов, потому что это не округлено. Вам придется закруглить углы вашего растрового изображения. Если у вас есть повторяющееся растровое изображение, вам стоит взглянуть на определение прорисовки из девяти патчей. Закруглите углы, затем определите часть графика, которая может расширяться.
http://developer.android.com/guide/topics/resources/drawable-resource.html
Было бы неплохо, если бы мы могли просто добавить растровое изображение к рисуемой фигуре и применить его в качестве обложки к любой фигуре, которую мы рисуем. Бьюсь об заклад, если вы знаете, что делаете, вы можете создать подкласс Shape, который рисует растровое изображение, но, к сожалению, он не включен в Android из коробки.
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 - и маскирует базовый макет, рисуясь на переднем плане.
Вот пример, показывающий серые закругленные углы поверх стандартного макета.
НТН
Уровень API 21 (Lollipop) добавил View.setClipToOutline. Из документации Android по определению теней и отсечений:
Чтобы обрезать представление по форме для рисования, установите его в качестве фона представления... и вызовите метод View.setClipToOutline().
Я проверил это, установив фон родительского представления в GradientDrawable с угловым радиусом, и дочерние представления правильно обрезались, чтобы соответствовать тем же закругленным углам родительского.