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 - и маскирует базовый макет, рисуясь на переднем плане.

Вот пример, показывающий серые закругленные углы поверх стандартного макета.

maskedLayout

НТН

Уровень API 21 (Lollipop) добавил View.setClipToOutline. Из документации Android по определению теней и отсечений:

Чтобы обрезать представление по форме для рисования, установите его в качестве фона представления... и вызовите метод View.setClipToOutline().

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

Другие вопросы по тегам