둥근 모서리로 보는 방법?


94

둥근 모서리가있는 Android에서보기를 만들려고합니다. 지금까지 찾은 해결책은 모서리가 둥근 모양을 정의하고 해당 뷰의 배경으로 사용하는 것입니다.

내가 한 일은 다음과 같습니다. 드로어 블을 아래와 같이 정의하십시오.

<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ϡ 2014-09-27

3
android.support.v7.widget.CardView가 이에 대한 해결책 인 것 같습니다.
rocketspacer

이 솔루션은 나를 위해 그것을 해결하지만, 서브 클래스가 필요합니다 /programming/5574212/android-view-clipping
아론

이것이 귀하의 질문에 대답합니까? 이미지 둥근 이미지에 테두리 추가 android
user4157124

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
이 레이아웃을 확대 / 축소 기능이있는 imageview에 사용하고 있지만이 레이아웃은 확대 / 축소를 시도 할 때 터치 리스너를 감지 할 수 없습니다.이 레이아웃에 터치 리스너 기능을 추가하는 방법은 무엇입니까?
Muhammad Nafian Wildana 2015-06-05

2
이 방법을 사용하고 잘 작동합니다. 그러나 레이아웃 안에 EditText를 넣으면 입력 할 때 화면이 업데이트되지 않습니다. 창을 닫으면 텍스트가 표시됩니다. 키보드를 닫으면 화면이 업데이트됩니다. 이것에 대한 수정 사항이 있습니까?
Sajib Acharya

1
Recycler보기와 함께 사용할 때의 유일한 문제는 전체 항목 집합이로드 될 때까지 기다리지 않는다는 것입니다. 그리고 몇 가지 항목 만 반올림합니다. 이런 일이 발생하는 이유가 있습니까?
Ahmed

2
이것은 자리 표시 자 전환을 사용하는 글라이드 라이브러리에서로드 된 이미지 (또는 실제로 다른 애니메이션 하위)에서는 작동하지 않습니다. 대체 솔루션이 있지만 배경색이 단색이어야합니다. gist.github.com/grennis/da9f86870c45f3b8ae00912edb72e868
Greg Ennis

2
훌륭하고 유용한 솔루션이지만 너무 비쌉니다. 하나의 그림이 포함 된 6 개의 요소 만있는 RecyclerView는 부드럽게 스크롤 할 수 없습니다. 그리고 그것은 장치 전원 (Samsung S9 또는 Wileyfox Swift 2)에 의존하지 않습니다. stackoverflow.com/a/41098690/4399323 이 더 나은 대답입니다!
Valentin Yuryev

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

고도를 제거 할 수 없습니다. 설계에 고도가 필요한 경우 잘 작동합니다.
Abdalrahman Shatou

1
@AbdalrahmanShatou developer.android.com/reference/android/support/v7/widget/… 속성이 있습니다. "0"으로 설정해 보셨습니까?
rocketspacer

5
한 가지 단점이 지원하지 않는다는 것입니다 <21 안드로이드 API입니다
이타 스펙터

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은 쓸모가 없으며 이미지 뷰는 여전히 뷰 외부로 확장됩니다.
Abdalrahman Shatou

1
그에 대한 현상금을 드릴 수 있으면 좋겠습니다. 감사합니다
Odys

3
이미지 내용 뒤에 배경이 그려 지므로 이미지가 직사각형 인 경우에는이 방법이 작동하지 않을 것이라고 생각합니다. 이것은 투명도가 있고 모서리가 둥근 이미지에서만 작동 할 수 있습니다.
Harsha Vardhan

22

Jaap van Hengstum의 답변 은 훌륭하지만 비용이 많이 들고 예를 들어이 방법을 Button에 적용하면 뷰가 비트 맵으로 렌더링되기 때문에 터치 효과가 손실됩니다.

나에게 가장 좋은 방법과 가장 간단한 방법은 다음과 같이 뷰에 마스크를 적용하는 것입니다.

@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);
}

이것을 사용하는 방법?
Maksim Kniazev

@MaksimKniazev 원하는 레이아웃의 하위 클래스 (예 : FrameLayout)를 만든 다음이 두 메서드를이 하위 클래스에 붙여넣고 '<whatever_you_want>'를 원하는 모서리 반경 값 (예 : 리소스)으로 바꿉니다. 그게 다야. 당신에게 충분합니까, 아니면 예가 필요합니까?
Donkey

정말 감사합니다. RecyclerView에서 더 잘 작동합니다!
Valentin Yuryev

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>

2
화면에 애니메이션이 많지 않으면 화면이 여러 번 그려지는 경우 잘 작동합니다. 왜냐하면 성능이 크게 저하되기 때문입니다. (- API 17 이하에서 나쁜하지만 porterFilterDuffColor 사용 클리핑 사용하지 경로 또는 canvas.drawRoundRect) 효율적인 둥근 모서리 방법을 가지고 cardview을 시도해야
응우 엔 탄 날엔

18

라는 XML 파일 만들기 round.xmldrawable폴더를하고이 내용을 붙여 넣기 :

<?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에서 둥근 모서리 만 필요한 경우 셰이더를 사용하여 배경으로 사용중인 모양 위에 이미지를 '페인트'할 수 있습니다. 예를 들어이 라이브러리 를 살펴보십시오 .

  • 정말로 모든 자식을 잘라 내야한다면 레이아웃을 다시 볼 수 있습니까? 어떤 색을 사용하든 배경이 있고 가운데에 둥근 '구멍'이있는 것? 실제로 onDraw 메서드를 재정의하는 모든 자식 위에 해당 모양을 그리는 사용자 지정 ViewGroup을 만들 수 있습니다.


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-rounded-corners/

전체 Android UI 툴킷의 주요 개발자 중 한 명인 Guy Romain이 작성한이 게시물에 따르면 둥근 모서리가있는 컨테이너 (및 그의 모든 하위 뷰)를 만들 수 있지만, 그는 너무 비싸다고 설명했습니다. 렌더링 문제).

그의 게시물에 따라 갈 것을 권장하고 둥근 모서리를 원한다면 둥근 모서리를 구현하십시오. 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안드로이드 스튜디오 3.0.1 API 27에 나를 위해 일했다. 는 colorPrimary에서 참조 된 res/values/colors.xml파일을 그냥 예입니다. 0dp그것 의 layout_width의 경우 부모의 너비로 늘어납니다. 필요에 따라 제약 조건과 너비 / 높이를 구성해야합니다.

<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);

어두운 테마에 대한 heightOverlay도 적용하려면 다음을 사용하십시오.

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

Jaap van Hengstum의 답변과의 차이점 :

  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">

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을 ur 뷰에 배경으로 적용합니다 .... 또는 ... 그라디언트를 사용하여 코드에서 수행합니다.


나는 이미 그것을했지만 더 나은 방법이 있는지 알고 싶습니까?
Zach

요청자는 이미 질문에서이 접근 방식을 시도했다고 언급했습니다.
Michael Krause 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.