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

94

Я пытаюсь сделать вид в android с закругленными краями. Решение, которое я нашел до сих пор, - определить фигуру со скругленными углами и использовать ее в качестве фона для этого представления.

Вот что я сделал, определил drawable, как указано ниже:

<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>

Теперь я использовал это как фон для своего макета, как показано ниже:

<LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/rounded_corner">

Это работает отлично, я вижу, что у обзора закругленные края.

Но в моем макете есть много других дочерних представлений, например ImageView или MapView. Когда я помещаюImageView внутри макета выше, углы изображения не обрезаются / не обрезаются, вместо этого оно кажется заполненным.

Я видел другие обходные пути, чтобы заставить его работать так, как описано здесь .

Но существует ли способ установить закругленные углы для представления, и все его дочерние представления содержатся в этом основном представлении с закругленными углами?

Зак
источник
Что, если вы используете настраиваемый макет, расширяющийся до LinearLayout, и пока его объект создается, итерации всех дочерних элементов этого макета и применения к ним закругленного фона границы?
MysticMagicϡ
3
android.support.v7.widget.CardView кажется решением для этого
rocketspacer
Это решение решить это для меня, но требует подклассов: /programming/5574212/android-view-clipping
Аарон
У Google новая структура, новые технологии лучше [Jetpack Compose] [1] [1]: stackoverflow.com/questions/6054562/…
Ucdemir

Ответы:

128

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

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

package com.example;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 40.0f;

    private Bitmap maskBitmap;
    private Paint paint, maskPaint;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas offscreenCanvas = new Canvas(offscreenBitmap);

        super.draw(offscreenCanvas);

        if (maskBitmap == null) {
            maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
        }

        offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint);
        canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint);
    }

    private Bitmap createMask(int width, int height) {
        Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
        Canvas canvas = new Canvas(mask);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);

        canvas.drawRect(0, 0, width, height, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);

        return mask;
    }
}

Используйте это как обычный макет:

<com.example.RoundedCornerLayout
    android:layout_width="200dp"
    android:layout_height="200dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/test"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#ff0000"
        />

</com.example.RoundedCornerLayout>
Яап ван Хенгстум
источник
1
Я использую этот макет для просмотра изображений с функцией масштабирования внутри, но этот макет не может обнаруживать сенсорный прослушиватель, когда я пытаюсь увеличить масштаб, как добавить функцию сенсорного прослушивателя в этот макет?
Мухаммад Нафиан Вильдана
2
Я использовал этот метод и работает нормально. Но когда я помещаю EditText в макет, экран не обновляется, когда я набираю текст. Когда я закрываю окно, отображается текст. Экран обновляется, когда я закрываю клавиатуру. Что-нибудь исправить?
Саджиб Ачарья
1
Единственная проблема с этим, когда вы используете его с представлением Recycler, заключается в том, что он не ждет загрузки полного набора элементов. И округляет всего несколько пунктов. Есть ли причина для этого?
Ахмед
2
Это не работает с изображениями, загруженными из библиотеки скольжения, которые используют переходы-заполнители (или на самом деле с любыми другими анимированными дочерними элементами). У меня есть альтернативное решение, но оно требует, чтобы цвет фона был сплошным. См. Gist.github.com/grennis/da9f86870c45f3b8ae00912edb72e868
Грег Эннис,
2
Прекрасное и полезное решение, но слишком дорогое. RecyclerView с шестью элементами, который содержит одно изображение, не может плавно прокручиваться. И это не зависит от мощности устройства (Samsung S9 или Wileyfox Swift 2). stackoverflow.com/a/41098690/4399323 - лучший ответ!
Валентин Юрьев
73

Или вы можете использовать android.support.v7.widget.CardViewвот так:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@color/white"
    card_view:cardCornerRadius="4dp">

    <!--YOUR CONTENT-->
</android.support.v7.widget.CardView>
ракета
источник
Я пробовал много способов, ваш - лучшее решение моей проблемы. БЛАГОДАРНОСТЬ!
wizChen
Невозможно убрать возвышение. Прекрасно работает, если конструкция требует возвышения.
Абдалрахман Шату
1
@AbdalrahmanShatou developer.android.com/reference/android/support/v7/widget/… для этого есть свойства. Вы пробовали установить их на «0»?
rocketspacer
5
Одним из недостатков является то, что он не поддерживает <21 android api
Itai Spector
52

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

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

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

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

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

</shape>

и внутри тебя макет

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/shape">

        <ImageView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:src="@drawable/your image"
             android:background="@drawable/shape">

</LinearLayout>
Вайшали Сутария
источник
3
@Zach: Как это не сработало? Так же, как ваше приложение работало, когда вы задали исходный вопрос?
LarsH
2
clipChildren бесполезен, и представление изображения по-прежнему выходит за пределы представления.
Абдалрахман Шату
1
Хотел бы я дать вам за это награду. Спасибо
Odys
3
Я не думаю, что этот подход будет работать, если изображение прямоугольное, так как фон будет отрисован за содержимым изображения. Это может работать только с изображениями, которые имеют прозрачность и сами имеют закругленные углы.
Харша
23

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

Для меня лучший и самый простой метод заключается в применении маски к виду, например:

@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
    super.onSizeChanged(width, height, oldWidth, oldHeight);

    float cornerRadius = <whatever_you_want>;
    this.path = new Path();
    this.path.addRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, Path.Direction.CW);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    if (this.path != null) {
        canvas.clipPath(this.path);
    }
    super.dispatchDraw(canvas);
}
Осел
источник
Как это использовать?
Максим Князев
@MaksimKniazev Создайте подкласс желаемого макета (например, FrameLayout), затем вставьте эти два метода в этот подкласс и замените «<whatever_you_want>» на желаемое значение радиуса угла (например, из ресурсов). Вот и все. Вам это достаточно ясно или вам нужен пример?
Осел
Большое спасибо, он действительно лучше работает с RecyclerView!
Валентин Юрьев
18

Если у вас возникли проблемы при добавлении сенсорных слушателей в макет. Используйте этот макет как родительский.

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 6.0f;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }


    @Override
    protected void dispatchDraw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.dispatchDraw(canvas);
        canvas.restoreToCount(count);
    }


}

в качестве

<?xml version="1.0" encoding="utf-8"?>
<com.example.view.RoundedCornerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/patentItem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingRight="20dp">
        ... your child goes here
    </RelativeLayout>
</com.example.view.RoundedCornerLayout>
Sushant
источник
2
Это хорошо работает, если на экране не так много анимаций, которые заставляют экран рисовать снова и снова много раз; так как это существенно снизит производительность. Следует попробовать cardview, у которого есть эффективный метод закругления (не используйте обтравочный контур или canvas.drawRoundRect - плохо в API 17 ниже, но используйте porterFilterDuffColor)
Nguyen Tan Dat
18

Создайте файл xml с именем round.xmlв drawableпапке и вставьте это содержимое:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <solid android:color="#FFFFFF" />
  <stroke android:width=".05dp" android:color="#d2d2d2" />
  <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/>
</shape>

затем используйте round.xmlas backgroundдля любого элемента. Тогда у вас получатся закругленные углы.

Аджай Венугопал
источник
9

В Android L вы сможете просто использовать View.setClipToOutline, чтобы получить этот эффект. В предыдущих версиях не было возможности просто обрезать содержимое произвольной ViewGroup определенной формы.

Вам нужно будет придумать что-то, что дало бы вам аналогичный эффект:

  • Если вам нужны только закругленные углы в ImageView, вы можете использовать шейдер, чтобы «нарисовать» изображение поверх формы, которую вы используете в качестве фона. Взгляните на эту библиотеку для примера.

  • Если вам действительно нужно, чтобы все дочерние элементы были обрезаны, может быть, вы можете еще раз просмотреть макет? Один с фоном любого цвета, который вы используете, и круглым «отверстием» посередине? Фактически вы можете создать настраиваемую ViewGroup, которая рисует эту фигуру над всеми дочерними элементами, переопределяя метод onDraw.

ивагарз
источник
4

Создайте файл xml в папке с возможностью переноса со следующим кодом. (Имя созданного мной файла - rounded_corner.xml)

rounded_corner.xml

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

        <!-- view background color -->
        <solid
            android:color="#a9c5ac" >
        </solid>

        <!-- view border color and width -->
        <stroke
            android:width="3dp"
            android:color="#1c1b20" >
        </stroke>

        <!-- If you want to add some padding -->
        <padding
            android:left="4dp"
            android:top="4dp"
            android:right="4dp"
            android:bottom="4dp"    >
        </padding>

        <!-- Here is the corner radius -->
        <corners
            android:radius="10dp"   >
        </corners>
    </shape>

И оставьте это drawableкак backgroundдля вида, граница которого должна быть закругленной. Давай оставим это наLinearLayout

    <LinearLayout android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/rounded_corner"
            android:layout_centerInParent="true">

            <TextView android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Hi, This layout has rounded corner borders ..."
                android:gravity="center"
                android:padding="5dp"/>

    </LinearLayout>
Раджниш Шукла
источник
3

следуйте этому руководству и всем обсуждениям под ним - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-ounded-corners/

согласно этому сообщению, написанному Гаем Роменом, одним из ведущих разработчиков всего набора инструментов пользовательского интерфейса Android, можно создать контейнер (и все его дочерние представления) с закругленными углами, но он объяснил, что это слишком дорого (из-за производительности вопросы рендеринга).

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

это то, что я тоже сделал в конце концов.

Тал Канель
источник
3

Вы можете использовать androidx.cardview.widget.CardViewтак:

<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"       
        app:cardCornerRadius="@dimen/dimen_4"
        app:cardElevation="@dimen/dimen_4"
        app:contentPadding="@dimen/dimen_10">

       ...

</androidx.cardview.widget.CardView>

ИЛИ

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

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

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

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

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

</shape>

и внутри тебя макет

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape">

        ...

</LinearLayout>
Рахул
источник
3

У CardViewменя работал API 27 в Android Studio 3.0.1. colorPrimaryБыла ссылка в res/values/colors.xmlфайле и это всего лишь пример. Для layout_width 0dpон будет растягиваться до ширины родителя. Вам нужно будет настроить ограничения и ширину / высоту в соответствии с вашими потребностями.

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardCornerRadius="4dp"
    app:cardBackgroundColor="@color/colorPrimary">

    <!-- put your content here -->

</android.support.v7.widget.CardView>
Ллойд Рочестер
источник
3

С помощью библиотеки компонентов материала лучший способ создать объект Viewсо скругленными углами - это использоватьMaterialShapeDrawable .

Создайте ShapeAppearanceModel с настраиваемыми закругленными углами:

ShapeAppearanceModel shapeAppearanceModelLL1 = new ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED,radius16)
        .build();

Создайте MaterialShapeDrawable:

MaterialShapeDrawable shapeDrawableLL1 = new MaterialShapeDrawable(shapeAppearanceModeLL1);

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

MaterialShapeDrawable shapeDrawableLL1 = MaterialShapeDrawable.createWithElevationOverlay(this, 4.0f);
shapeDrawableLL1.setShapeAppearanceModel(shapeAppearanceModelLL1);

Необязательно: примените к shapeDrawable цвет фона и обводку

shapeDrawableLL1.setFillColor(
       ContextCompat.getColorStateList(this,R.color...));
 shapeDrawableLL1.setStrokeWidth(2.0f);
 shapeDrawableLL1.setStrokeColor(
       ContextCompat.getColorStateList(this,R.color...));

Наконец, примените shapeDrawable в качестве фона в вашем LinearLayout(или другом представлении):

LinearLayout linearLayout1= findViewById(R.id.ll_1);
ViewCompat.setBackground(linearLayout1,shapeDrawableLL1);

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

Габриэле Мариотти
источник
2

Отличие от ответа Яапа ван Хенгстума:

  1. Используйте BitmapShader вместо растрового изображения маски.
  2. Создайте растровое изображение только один раз.
public class RoundedFrameLayout extends FrameLayout {
    private Bitmap mOffscreenBitmap;
    private Canvas mOffscreenCanvas;
    private BitmapShader mBitmapShader;
    private Paint mPaint;
    private RectF mRectF;

    public RoundedFrameLayout(Context context) {
        super(context);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        if (mOffscreenBitmap == null) {
            mOffscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
            mOffscreenCanvas = new Canvas(mOffscreenBitmap);
            mBitmapShader = new BitmapShader(mOffscreenBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(mBitmapShader);
            mRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight());
        }
        super.draw(mOffscreenCanvas);

        canvas.drawRoundRect(mRectF, 8, 8, mPaint);
    }
}
Питер Чжао
источник
2
public class RoundedCornerLayout extends FrameLayout {
    private double mCornerRadius;

    public RoundedCornerLayout(Context context) {
        this(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    public double getCornerRadius() {
        return mCornerRadius;
    }

    public void setCornerRadius(double cornerRadius) {
        mCornerRadius = cornerRadius;
    }

    @Override
    public void draw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), (float) mCornerRadius, (float) mCornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.draw(canvas);
        canvas.restoreToCount(count);
    }
}
Махмуд
источник
1

Ссылка на учебник, которую вы предоставили, похоже, предполагает, что вам необходимо установить для свойств layout_width и layout_height ваших дочерних элементов значение match_parent.

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
danielcooperxyz
источник
1

Чтобы создать изображение с закругленными углами, используя com.google.android.material: material: 1.2.0-beta01

 float radius = context.getResources().getDimension(R.dimen.border_radius_hug);
    shapeAppearanceModel = new ShapeAppearanceModel()
            .toBuilder()
            .setAllCorners(CornerFamily.ROUNDED,radius)
            .build();

imageView.setShapeAppearanceModel(shapeAppearanceModel)

или если вы хотите использовать его в файле xml:

  <com.google.android.material.imageview.ShapeableImageView
            android:id="@+id/thumb"
            android:layout_width="80dp"
            android:layout_height="60dp"
            app:shapeAppearanceOverlay="@style/circleImageView"
            />

в style.xml добавьте это:

<style name="circleImageView" parent="">
      <item name="cornerFamily">rounded</item>
      <item name="cornerSize">10%</item>
</style>
Эрфан Эгтерафи
источник
0

попробуйте это свойство со своим линейным макетом, это поможет
tools: context = ". youractivity"


источник
0
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {

        Bitmap roundedBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(roundedBitmap);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return roundedBitmap;
    }
Бисваджит Кармакар
источник
0

На случай, если вы хотите закруглить какой-то конкретный угол.

fun setCorners() {
        
        val mOutlineProvider = object : ViewOutlineProvider() {
            override fun getOutline(view: View, outline: Outline) {

                val left = 0
                val top = 0;
                val right = view.width
                val bottom = view.height
                val cornerRadiusDP = 16f
                val cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, cornerRadiusDP, resources.displayMetrics).toInt()

                // all corners
                outline.setRoundRect(left, top, right, bottom, cornerRadius.toFloat())

                /* top corners
                outline.setRoundRect(left, top, right, bottom+cornerRadius, cornerRadius.toFloat())*/

                /* bottom corners
                outline.setRoundRect(left, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

                /* left corners
                outline.setRoundRect(left, top, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* right corners
                outline.setRoundRect(left - cornerRadius, top, right, bottom, cornerRadius.toFloat())*/

                /* top left corner
                outline.setRoundRect(left , top, right+ cornerRadius, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* top right corner
                outline.setRoundRect(left - cornerRadius , top, right, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* bottom left corner
                outline.setRoundRect(left, top - cornerRadius, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* bottom right corner
                outline.setRoundRect(left - cornerRadius, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

            }
        }

        myView.apply {
            outlineProvider = mOutlineProvider
            clipToOutline = true
        }
    }
Тимур Панжиев
источник
-1

Используйте форму в xml с прямоугольником. Установите свойство нижнего или верхнего радиуса как хотите. Затем примените этот xml в качестве фона для просмотра ур .... или ... используйте градиенты, чтобы сделать это из кода.

Pratik Deogade
источник
Я уже это сделал, но хочу знать, есть ли способ лучше?
Zach
Запрашивающий уже упоминал, что пробовал этот подход в своем вопросе.
Майкл Краузе