Как сделать макет со скругленными углами ..?

Как сделать макет со скругленными углами? Я хочу применить закругленные углы к моему LinearLayout.


person Addy    schedule 23.04.2013    source источник
comment
вам просто нужно установить закругленное изображение в качестве фона макета, иначе сделайте форму, как сказано в первом комментарии   -  person SilentKiller    schedule 23.04.2013
comment
вам просто нужно поискать по ТАК ... вы найдете много ответов ..   -  person Pankaj Kumar    schedule 23.04.2013
comment
углы закрыты для меня   -  person filthy_wizard    schedule 02.11.2017
comment
У Google новая структура, новые технологии лучше Jetpack Написать   -  person Ucdemir    schedule 27.09.2020


Ответы (19)


1. Определите layout_bg.xml в чертежах:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="3dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

2. Добавьте layout_bg.xml в качестве фона в свой макет

android:background="@drawable/layout_bg"
person Gaurav Arora    schedule 23.04.2013
comment
Это не работает. как вы установили, это фон, поэтому контент перекрывает закругленные углы, и если у вас есть контент, который рисует по углам, вы не увидите, как они округляются. - person android developer; 14.05.2014
comment
Почти всегда мой контент никогда не покрывает углы. Это прекрасно работает. - person David J. Y. Tang; 25.07.2014
comment
Как избежать ошибки Element shape doesn't have the required attribute android:layout_height? - person Lorenz; 31.07.2015
comment
Как сделать его кругом .. он будет прямоугольником - person Tarun; 18.12.2015
comment
Element shape doesn't have the required attribute android:layout_height Причина появления ошибки в том, что layout_bg.xml не находился в папке для рисования. - person Atul; 01.09.2016
comment
Каким-то образом комментарий о том, что он вообще не работает (что правильно), имеет 100 положительных голосов, но вопрос имеет только 4 отрицательных голоса ... что происходит с этим сайтом? - person nhouser9; 29.05.2017
comment
для тех, у кого возникла ошибка Форма элемента не ... поместите xml в папку drawable! - person Siwei; 30.08.2017
comment
Что-то идет не так, когда такой неправильный ответ набирает столько голосов - person Lluis Felisart; 06.10.2017
comment
@androiddeveloper, какое решение? - person Anirudh; 25.10.2017
comment
@Anirudh Посмотрите мой ответ: stackoverflow.com/a/23650467/878126. Обратите внимание, что я не тестировал его долгое время и больше не помню, как он работает. Надеюсь, это поможет. - person android developer; 25.10.2017
comment
@ nhouser9: на самом деле это больше похоже на работу, но имейте в виду, что ваш передний план / контент может рисоваться в углах. Таким образом, в зависимости от варианта использования это может сработать на 100%. Я рад, что в ответе не так много отрицательных голосов, потому что он полезен, и я рад, что за комментарий набрано сотни положительных голосов, потому что с помощью этого решения легко обнаружить ограничение. Лучшее из обоих миров. - person Benoit Duffez; 01.01.2018
comment
это не работает при одновременном использовании нескольких линейных макетов с разными цветами фона - person JAMSHAID; 31.01.2019
comment
Это может привести к тому, что радиус не будет отображаться на углах (пока форма является прямоугольной), в то время как сплошной цвет может быть любым, кроме белого, поэтому попробуйте список слоев с двумя элементами, с первым элементом прямоугольника сплошным цветом, а вторым - сплошным цветом. хотел. - person Krantiz; 03.04.2019
comment
@androiddeveloper, добавление padding решает проблему в любом случае? - person micaball; 23.08.2019
comment
@micaball Ну, это смотря в каком случае. Если вы хотите, чтобы контент был округлен, это не сработает, как я уже писал. Если вам просто нужен прямоугольник содержимого внутри чего-то закругленного, это нормально ... Вы можете проверить мое последнее решение здесь: stackoverflow.com/ а / 23650467/878126. Я думаю, он охватит все варианты, которые вы хотите - person android developer; 23.08.2019
comment
Для людей, как говорят, что это покрывает их контент, проблема в том, что вы должны добавить это в качестве фона вложенного макета. пример. Внешний LinearLayout с прозрачным фоном, а затем внутренний LinearLayout с этим выдвигаемым набором в качестве фона, и вы всегда можете установить отступы и поля в соответствии с вашими потребностями. - person AZ_; 12.02.2020
comment
Я не уверен, что добавление отступов 0dp будет иметь какой-либо эффект - person HendraWD; 07.08.2020
comment
android: backgroundTint = @ color / your_color, если вы хотите изменить цвет. - person J A S K I E R; 24.03.2021

Для API 21+ используйте просмотры клипов

Обрезка закругленных контуров была добавлена ​​к классу View в API 21. См. Этот учебный документ или эту ссылку для получения дополнительной информации. .

Эта встроенная функция позволяет легко реализовать закругленные углы. Он работает с любым видом или макетом и поддерживает правильную обрезку.

Вот что делать:

  • Создайте закругленную фигуру, которую можно рисовать, и установите ее в качестве фона вашего представления: android:background="@drawable/round_outline"
  • Обрезать в коде: setClipToOutline(true)

В документации говорилось, что вы можете установить android:clipToOutline="true" XML, но эта ошибка теперь, наконец, решен, и в документации теперь правильно указано, что вы можете сделать это только в коде.

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

примеры с clipToOutline и без

Специальное примечание о ImageViews

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

Это означает, что если вы хотите скруглить углы в ImageView с помощью setClipToOutline(), ваше изображение должно исходить из android:src, а не из android:background (поскольку фон используется для закругленной формы). Если вы ДОЛЖНЫ использовать фон для установки изображения вместо src, вы можете использовать этот обходной путь вложенных представлений:

  • Создайте внешний макет с его фоном, установленным в соответствии с вашей фигурой, которую можно рисовать
  • Оберните этот макет вокруг вашего ImageView (без отступов)
  • ImageView (включая все остальное в макете) теперь будет обрезан по закругленной форме внешнего макета.
person hungryghost    schedule 07.06.2015
comment
Не работает с API ниже 21. Не могу дождаться, пока я смогу поддерживать только API 21. - person startoftext; 13.01.2016
comment
Использование setClipToOutline работает, но также удаляет сам фрейм (тот, который вы используете для фона). Есть ли способ избежать этого? - person android developer; 16.11.2017
comment
Вы читали мою заметку об использовании src=@drawable... вместо background=@drawable? Вы можете сделать это или вложить свой ImageView в контейнерное представление, содержащее контур формы. - person hungryghost; 22.11.2017
comment
Все комментируют эту ошибку - ей почти три года, и нет никаких признаков того, что ее исправят в любое время в этом десятилетии. Давайте немного надавим. - person Josh Hansen; 15.03.2018
comment
Как можно еще не исправить эту ошибку - person P Fuster; 15.07.2018
comment
как использовать эту функцию на нижних API ниже 21? - person Febin Mathew; 16.07.2018
comment
@FebinMathew Ты не можешь. - person JediBurrell; 08.09.2018
comment
У меня есть imageView внутри NestedScrollView, внутри Constaint Layout. Я использую android: src, чтобы поместить изображение в ImageView. Я использую clipToOutline = true для всех трех макетов. Я использую фигуру с закругленными углами. Но форма изображения! = Его форма корневого слоя - person StayCool; 11.06.2020
comment
Обратите внимание: это не сработает, если мы установим только нижние углы в нашей фигуре, которую можно рисовать. - person Andrei K.; 07.07.2020
comment
в случае ресайклервью некоторые предметы теряют закругленные углы - person Snake; 11.01.2021

Вот копия XML-файла для создания чертежа с белым фоном, черной рамкой и закругленными углами:

 <?xml version="1.0" encoding="UTF-8"?> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <solid android:color="#ffffffff"/>    

        <stroke android:width="3dp"
                android:color="#ff000000"
                />

        <padding android:left="1dp"
                 android:top="1dp"
                 android:right="1dp"
                 android:bottom="1dp"
                 /> 

        <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp" android:topRightRadius="7dp"/> 
    </shape>

сохраните его как файл xml в каталоге для рисования, используйте его, как если бы вы использовали любой доступный для рисования фон (значок или файл ресурсов), используя его имя ресурса (R.drawable.your_xml_name)

person kyogs    schedule 23.04.2013
comment
Очень понравилась возможность закругления определенных углов. - person Mercury; 26.01.2017
comment
Этот ответ в значительной степени является ответом, приведенным выше. Единственное реальное изменение здесь - это определение радиуса каждого угла, и, учитывая его одинаковое значение для каждого угла, я бы вместо этого написал его в одну строку: <corners android:radius="7dp" /> :) - person ZooMagic; 12.01.2018
comment
это ЛУЧШИЙ ответ для меня, так как он охватывает возможность закругления определенных углов ... хорошая работа, работает на 100% - person Mahmoud Ayman; 09.05.2018
comment
Углы ImageView не закруглены (обрезаны), как мне решить эту проблему? - person c0dehunter; 09.04.2019

Используйте CardView в библиотеке поддержки android v7. Хотя он немного тяжелый, он решает все проблемы, и достаточно просто. В отличие от метода set drawable background, он может успешно обрезать подпредставления.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@android:color/transparent"
    card_view:cardCornerRadius="5dp"
    card_view:cardElevation="0dp"
    card_view:contentPadding="0dp">
    <YOUR_LINEARLAYOUT_HERE>
</android.support.v7.widget.CardView>
person Evan JIANG    schedule 29.07.2015
comment
Намного лучше для всех, кто может себе это позволить, чем что-либо еще. Меня сбивает с толку, что такая простая вещь не является частью стандартных представлений Android, являясь основным продуктом CSS практически для любого веб-браузера. - person Ben Philipp; 20.04.2018

Я сделал так:

Проверить снимок экрана:

Фон относительного макета

Создайте файл с возможностью рисования с именем custom_rectangle.xml в папке с возможностью рисования:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="@android:color/white" />

    <corners android:radius="10dip" />

    <stroke
        android:width="1dp"
        android:color="@android:color/white" />

</shape>

Теперь примените прямоугольный фон к представлению:

mView.setBackground(R.drawlable.custom_rectangle);

Готово

person Hiren Patel    schedule 23.04.2013
comment
Это не работает. как вы установили, это фон, поэтому контент перекрывает закругленные углы, и если у вас есть контент, который рисует по углам, вы не увидите, как они округляются. - person android developer; 14.05.2014

Я думаю, что лучший способ сделать это - объединить две вещи:

  1. сделайте растровое изображение макета, как показано здесь.

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

  3. установите возможность рисования в imageView.

Это будет обрабатывать случаи, которые не удалось решить другими решениями, например наличие содержимого с углами.

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

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

Вот пример того, как это можно сделать:

RoundedCornersDrawable.java

/**
 * shows a bitmap as if it had rounded corners. based on :
 * http://rahulswackyworld.blogspot.co.il/2013/04/android-drawables-with-rounded_7.html
 * easy alternative from support library: RoundedBitmapDrawableFactory.create( ...) ; 
 */
public class RoundedCornersDrawable extends BitmapDrawable {

    private final BitmapShader bitmapShader;
    private final Paint p;
    private final RectF rect;
    private final float borderRadius;

    public RoundedCornersDrawable(final Resources resources, final Bitmap bitmap, final float borderRadius) {
        super(resources, bitmap);
        bitmapShader = new BitmapShader(getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        final Bitmap b = getBitmap();
        p = getPaint();
        p.setAntiAlias(true);
        p.setShader(bitmapShader);
        final int w = b.getWidth(), h = b.getHeight();
        rect = new RectF(0, 0, w, h);
        this.borderRadius = borderRadius < 0 ? 0.15f * Math.min(w, h) : borderRadius;
    }

    @Override
    public void draw(final Canvas canvas) {
        canvas.drawRoundRect(rect, borderRadius, borderRadius, p);
    }
}

CustomView.java

public class CustomView extends ImageView {
    private View mMainContainer;
    private boolean mIsDirty=false;

    // TODO for each change of views/content, set mIsDirty to true and call invalidate

    @Override
    protected void onDraw(final Canvas canvas) {
        if (mIsDirty) {
            mIsDirty = false;
            drawContent();
            return;
        }
        super.onDraw(canvas);
    }

    /**
     * draws the view's content to a bitmap. code based on :
     * http://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/
     */
    public static Bitmap drawToBitmap(final View viewToDrawFrom, final int width, final int height) {
        // Create a new bitmap and a new canvas using that bitmap
        final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bmp);
        viewToDrawFrom.setDrawingCacheEnabled(true);
        // Supply measurements
        viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.EXACTLY));
        // Apply the measures so the layout would resize before drawing.
        viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(), viewToDrawFrom.getMeasuredHeight());
        // and now the bmp object will actually contain the requested layout
        canvas.drawBitmap(viewToDrawFrom.getDrawingCache(), 0, 0, new Paint());
        return bmp;
    }

    private void drawContent() {
        if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0)
            return;
        final Bitmap bitmap = drawToBitmap(mMainContainer, getMeasuredWidth(), getMeasuredHeight());
        final RoundedCornersDrawable drawable = new RoundedCornersDrawable(getResources(), bitmap, 15);
        setImageDrawable(drawable);
    }

}

РЕДАКТИРОВАТЬ: нашел хорошую альтернативу, основанную на библиотеке RoundKornersLayouts. Имейте класс, который будет использоваться для всех классов макета, которые вы хотите расширить, для округления:

//based on https://github.com/JcMinarro/RoundKornerLayouts
class CanvasRounder(cornerRadius: Float, cornerStrokeColor: Int = 0, cornerStrokeWidth: Float = 0F) {
    private val path = android.graphics.Path()
    private lateinit var rectF: RectF
    private var strokePaint: Paint?
    var cornerRadius: Float = cornerRadius
        set(value) {
            field = value
            resetPath()
        }

    init {
        if (cornerStrokeWidth <= 0)
            strokePaint = null
        else {
            strokePaint = Paint()
            strokePaint!!.style = Paint.Style.STROKE
            strokePaint!!.isAntiAlias = true
            strokePaint!!.color = cornerStrokeColor
            strokePaint!!.strokeWidth = cornerStrokeWidth
        }
    }

    fun round(canvas: Canvas, drawFunction: (Canvas) -> Unit) {
        val save = canvas.save()
        canvas.clipPath(path)
        drawFunction(canvas)
        if (strokePaint != null)
            canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, strokePaint)
        canvas.restoreToCount(save)
    }

    fun updateSize(currentWidth: Int, currentHeight: Int) {
        rectF = android.graphics.RectF(0f, 0f, currentWidth.toFloat(), currentHeight.toFloat())
        resetPath()
    }

    private fun resetPath() {
        path.reset()
        path.addRoundRect(rectF, cornerRadius, cornerRadius, Path.Direction.CW)
        path.close()
    }

}

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

class RoundedConstraintLayout : ConstraintLayout {
    private lateinit var canvasRounder: CanvasRounder

    constructor(context: Context) : super(context) {
        init(context, null, 0)
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init(context, attrs, 0)
    }

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
        init(context, attrs, defStyle)
    }

    private fun init(context: Context, attrs: AttributeSet?, defStyle: Int) {
        val array = context.obtainStyledAttributes(attrs, R.styleable.RoundedCornersView, 0, 0)
        val cornerRadius = array.getDimension(R.styleable.RoundedCornersView_corner_radius, 0f)
        val cornerStrokeColor = array.getColor(R.styleable.RoundedCornersView_corner_stroke_color, 0)
        val cornerStrokeWidth = array.getDimension(R.styleable.RoundedCornersView_corner_stroke_width, 0f)
        array.recycle()
        canvasRounder = CanvasRounder(cornerRadius,cornerStrokeColor,cornerStrokeWidth)
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
            setLayerType(FrameLayout.LAYER_TYPE_SOFTWARE, null)
        }
    }

    override fun onSizeChanged(currentWidth: Int, currentHeight: Int, oldWidth: Int, oldheight: Int) {
        super.onSizeChanged(currentWidth, currentHeight, oldWidth, oldheight)
        canvasRounder.updateSize(currentWidth, currentHeight)
    }

    override fun draw(canvas: Canvas) = canvasRounder.round(canvas) { super.draw(canvas) }

    override fun dispatchDraw(canvas: Canvas) = canvasRounder.round(canvas) { super.dispatchDraw(canvas) }

}

Если вы хотите поддерживать атрибуты, используйте это, как написано в библиотеке:

<resources>
  <declare-styleable name="RoundedCornersView">
      <attr name="corner_radius" format="dimension"/>
      <attr name="corner_stroke_width" format="dimension"/>
      <attr name="corner_stroke_color" format="color"/>
  </declare-styleable>
</resources>

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

Пример:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:clipChildren="false" android:clipToPadding="false"
    tools:context=".MainActivity">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center"
        app:cardCornerRadius="8dp" app:cardElevation="8dp" app:strokeColor="#f00" app:strokeWidth="2dp">

        <ImageView
            android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0f0"/>

    </com.google.android.material.card.MaterialCardView>

</FrameLayout>

И результат:

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

Обратите внимание, что есть небольшая проблема с артефактами по краям штриха (там остаются некоторые пиксели содержимого), если вы его используете. Вы можете заметить это, если увеличите масштаб. Я сообщил об этой проблеме здесь < / а>.

РЕДАКТИРОВАТЬ: кажется, исправлено, но не в среде IDE. Об этом сообщается здесь.

person android developer    schedule 14.05.2014
comment
Спасибо за сборку этого замечательного ответа. Он заставил меня двигаться в правильном направлении, но мне бы пригодилась помощь по очень похожей проблеме здесь stackoverflow.com/questions/25877515/ - person Will Thomson; 17.09.2014
comment
Это дает ошибку, поскольку в ImageView нет конструктора по умолчанию. - person Anuj; 09.12.2014
comment
Это должен быть принятый ответ. Вместо плоской логики вы спустились и нашли отличное решение. Также это решает проблемы, которые вы упомянули в комментариях к другим ответам. Спасибо за ваши усилия, и, возможно, вы сможете исправить полностью функциональный класс и поделиться им через github. Я думаю, это может помочь слишком многим людям. - person Arda Kara; 05.01.2015
comment
@Senhor Ты думаешь, я должен? Я подумаю об этом. А пока вы можете увидеть другие созданные мной репозитории здесь: github.com/AndroidDeveloperLB?tab= репозитории - person android developer; 05.01.2015
comment
По мере того, как большая часть этого уже сделана, вы можете попробовать. Кстати, autofittextview выглядит действительно здорово. - person Arda Kara; 05.01.2015
comment
@Senhor Спасибо. Я попытался упростить понимание того, как это работает, хотя большая часть его кода вообще не была моим. Однако у него есть проблема. Надеюсь, я найду причину и исправлю ее. - person android developer; 06.01.2015
comment
Как я могу использовать это с LinearLayout? - person Ibrahim Disouki; 14.12.2015
comment
@ hema18 Вы можете использовать любой вид. Просто установите mMainContainer как представление, которое содержит другие (LinearLayout в вашем случае). - person android developer; 14.12.2015

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

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="5dp">
      <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".3"
                android:text="@string/quote_code"
                android:textColor="@color/white"
                android:textSize="@dimen/text_head_size" />
      </LinearLayout>
</android.support.v7.widget.CardView>

С помощью этого card_view: cardCornerRadius = "5dp" вы можете изменить радиус.

person Farruh Habibullaev    schedule 12.12.2016

Попробуй это...

1. создайте drawable xml (custom_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#FFFFFF" />

<stroke
    android:width="2dp"
    android:color="#FF785C" />

<corners android:radius="10dp" />

</shape>

2. добавить свой фон просмотра

android:background="@drawable/custom_layout"
person Silambarasan Poonguti    schedule 17.09.2014
comment
Так же, как я писал выше о подобном решении: это не работает. как вы установили, это фон, поэтому контент перекрывает закругленные углы, и если у вас есть контент, который рисует по углам, вы не увидите, как они округляются. - person android developer; 16.11.2017

С библиотекой компонентов материала вы можете использовать _1 _ , чтобы рисовать нестандартные формы.

Просто поместите LinearLayout в свой xml-макет:

<LinearLayout
    android:id="@+id/linear_rounded"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ..>

    <!-- content ..... -->

</LinearLayout>

Затем в своем коде вы можете применить ShapeAppearanceModel. Что-то вроде:

float radius = getResources().getDimension(R.dimen.default_corner_radius);

LinearLayout linearLayout= findViewById(R.id.linear_rounded);
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
    .toBuilder()
    .setAllCorners(CornerFamily.ROUNDED,radius)
    .build();

MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable(shapeAppearanceModel);
//Fill the LinearLayout with your color
shapeDrawable.setFillColor(ContextCompat.getColorStateList(this,R.color.secondaryLightColor));


ViewCompat.setBackground(linearLayout,shapeDrawable);

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

Примечание :: для этого требуется версия 1.1.0 библиотеки компонентов материалов.

person Gabriele Mariotti    schedule 23.12.2019
comment
Вот мое наблюдение, которое, надеюсь, может кому-то помочь. Если вы установите неправильный радиус для вышеупомянутого (чрезмерно высокий, скажем 56 вместо 20, если высота элемента управления, например, 40), вышеуказанные углы будут отображаться правильно в любом случае, но только с api 21. Для api 19 они будут ужасно запутанными. вверх :), если вы не введете правильный радиус. - person ror; 10.10.2020

Функция для программного задания радиуса угла

static void setCornerRadius(GradientDrawable drawable, float topLeft,
        float topRight, float bottomRight, float bottomLeft) {
    drawable.setCornerRadii(new float[] { topLeft, topLeft, topRight, topRight,
            bottomRight, bottomRight, bottomLeft, bottomLeft });
}

static void setCornerRadius(GradientDrawable drawable, float radius) {
    drawable.setCornerRadius(radius);
}

С использованием

GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setColor(Color.GREEN);
setCornerRadius(gradientDrawable, 20f);
//or setCornerRadius(gradientDrawable, 20f, 40f, 60f, 80f); 

view.setBackground(gradientDrawable);
person Linh    schedule 21.12.2017

Лучший и самый простой способ - использовать в макете возможность рисования card_background. Это также соответствует рекомендациям Google по материальному дизайну. Просто включите это в свой LinearLayout:

android:background="@drawable/card_background"

Добавьте это в свой каталог с возможностью рисования и назовите его card_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle">
            <solid android:color="#BDBDBD"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
</layer-list>
person Divyanshu Maithani    schedule 15.07.2015

Используйте CardView, чтобы получить закругленные края для любых макетов. Используйте card_view: cardCornerRadius = "5dp" для cardview, чтобы края макета закруглялись.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:card_view="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

      <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="5dp">
          <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="15dp"
                android:weightSum="1">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".3"
                    android:text="@string/quote_code"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_head_size" />

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".7"
                    android:text="@string/quote_details"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_head_size" />
            </LinearLayout>
       </android.support.v7.widget.CardView>
   </LinearLayout>
person vishnuc156    schedule 05.04.2016
comment
CardView из библиотеки support.v7, вы можете использовать из API7 или выше. - person Nikita G.; 31.05.2016

Лучше всего это сделать:

background_activity.xml

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:gravity="fill">
        <color android:color="@color/black"/>
    </item>
    <item>
        <shape android:gravity="fill">
            <solid android:color="@color/white"/>
            <corners android:radius="10dip"/>
            <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
        </shape>
    </item>
</layer-list>

Это также будет работать под API 21 и даст вам что-то вроде этого:

Результат


Если вы хотите приложить немного больше усилий для лучшего контроля, тогда используйте android.support.v7.widget.CardView с его атрибутом cardCornerRadius (и установите атрибут elevation на 0dp, чтобы избавиться от любой сопровождающей тени с помощью cardView). Кроме того, это будет работать с уровня API всего 15.

person Abdul Wasae    schedule 17.04.2017
comment
Если содержимое соответствует фону, оно переопределит его. На самом деле он не подходит к заданной вами форме. - person android developer; 16.11.2017
comment
Вы про другое мнение? Не могли бы вы обновить код, чтобы показать, что вы имеете в виду? По идее, на закругленных углах не было бы черной области. По углам должен быть прозрачный цвет. - person android developer; 16.11.2017
comment
О, теперь я понял твой вопрос. Думаю, для этого вы можете обойтись небольшой фиксированной маржой для вашего контента. - person Abdul Wasae; 17.11.2017
comment
Но тогда содержимое не будет обрезано до выбранной вами формы, потому что фиксированные поля имеют прямоугольную форму, а не в соответствии с выбранной вами формой. - person android developer; 18.11.2017

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="3dip" android:color="#B1BCBE" />
    <corners android:radius="10dip"/>
    <padding android:left="3dip" android:top="3dip" android:right="3dip" android:bottom="3dip" />
</shape>

@David, просто поместите отступы в то же значение, что и обводка, чтобы граница была видна, независимо от размера изображения

person paezinc    schedule 17.03.2015

Я взял ответ @gauravsapiens с моими комментариями внутри, чтобы дать вам разумное представление о том, на что будут влиять параметры.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Background color -->
    <solid android:color="@color/white" />

    <!-- Stroke around the background, width and color -->
    <stroke android:width="4dp" android:color="@color/drop_shadow"/>

    <!-- The corners of the shape -->
    <corners android:radius="4dp"/>

    <!-- Padding for the background, e.g the Text inside a TextView will be 
    located differently -->
    <padding android:left="10dp" android:right="10dp" 
             android:bottom="10dp" android:top="10dp" />

</shape>

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

Ради лени я создал форму внизу, которая представляет собой сплошной белый фон с закругленными углами - наслаждайтесь! :)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Background color -->
    <solid android:color="@color/white" />

    <!-- The corners of the shape -->
    <corners android:radius="4dp"/>

</shape>
person ZooMagic    schedule 12.01.2018

Создайте свой xml в формате drawable, layout_background.xml

 <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
      <solid android:color="@color/your_colour" />
      <stroke
            android:width="2dp"
            android:color="@color/your_colour" />
      <corners android:radius="10dp" />      
    </shape>
 <--width, color, radius should be as per your requirement-->

а затем добавьте это в свой layout.xml

 android:background="@drawable/layout_background"
person Bapusaheb Shinde    schedule 26.09.2017

Шаг 1. Определите файл bg_layout.xml в папке чертежей.

Шаг 2. Добавьте файл bg_layout.xml в качестве фона в макет.

    <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
        android:color="#EEEEEE"/> <!--your desired colour for solid-->

    <stroke
        android:width="3dp"
        android:color="#EEEEEE" /> <!--your desired colour for border-->

    <corners
        android:radius="50dp"/> <!--shape rounded value-->

</shape>
person Abdul Basit Rishi    schedule 14.09.2020

Вы можете сделать это в пользовательском представлении, например RoundAppBar и RoundBottomAppBar. Здесь path используется для clipPath холста.

Вид со скругленными углами

person Ali Rezaiyan    schedule 07.02.2021

Я немного опоздал на вечеринку, но это все еще проблема. Поэтому я написал набор OutlineProviders и BindingAdapters для привязки данных, который позволяет вырезать углы из xml.

ПРИМЕЧАНИЕ. Обрезка с контуром не поддерживает углы разных размеров!

Я написал подробный ответ с кодом в этом сообщении stackoverflow < / а>

Что вы получите с адаптером код + привязка:

<androidx.constraintlayout.widget.ConstraintLayout
    clipRadius="@{@dimen/some_radius}"
    clipBottomLeft="@{@dimen/some_radius}"
    clipBottomRight="@{@dimen/some_radius}"
    clipTopLeft="@{@dimen/some_radius}"
    clipTopRight="@{@dimen/some_radius}"
    clipCircle="@{@bool/clip}"

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

person Yokich    schedule 18.05.2021
comment
Если вам просто нужен округлый фон, это перебор, вам лучше использовать XML с возможностью рисования. Но если вы хотите скруглить углы макета, не говоря уже о том, чтобы изображение торчало, это правильный вариант. - person Yokich; 18.05.2021