programing

둥근 모서리로 레이아웃을 만드는 방법...?

newsource 2023. 6. 29. 20:10

둥근 모서리로 레이아웃을 만드는 방법...?

모서리가 둥근 레이아웃을 만들려면 어떻게 해야 합니까?둥근 모서리를 제 옷에 적용하고 싶습니다.LinearLayout.

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"

API 21+의 경우 클립 뷰 사용

이 근둥윤이추가습었니다되다음에에 되었습니다.View클래스는 API 21에 있습니다.자세한 내용은 이 교육 문서 또는 이 참조 문서를 참조하십시오.

이 내장된 기능을 통해 둥근 모서리를 구현하기가 매우 쉽습니다.모든 뷰 또는 레이아웃에서 작동하며 적절한 클리핑을 지원합니다.

해야 할 일:

  • 모양 한 모양을 합니다.android:background="@drawable/round_outline"
  • 코의개설명는클립하를:setClipToOutline(true)

를 설정할 수 입니다.android:clipToOutline="true"XML, 그러나 이 버그는 이제 최종적으로 해결되었으며 문서에는 코드에서만 이 작업을 수행할 수 있다고 올바르게 명시되어 있습니다.

모양:

examples with and without clipToOutline

이미지 보기에 대한 특별 참고 사항

setClipToOutline()보기의 배경이 그리기 가능한 모양으로 설정된 경우에만 작동합니다.이 배경 모양이 존재하는 경우 보기는 배경의 윤곽선을 잘라내기 및 음영 처리를 위한 테두리로 처리합니다.

즉, 이미지 보기에서 모서리를 반올림하려는 경우setClipToOutline()당신의 이미지는 에서 나와야 합니다.android:srcandroid:background(원형 모양에 배경이 사용되므로).해야 하는 과 같은 해결 을 사용할 수 . src 대 신 배 사 이 다 있 니 수 습 사 할 용 을 법

  • 배경이 도형 그리기 가능으로 설정된 외부 레이아웃 작성
  • 해당 레이아웃을 이미지 보기 주위로 래핑(패딩 없음)
  • 이제 이미지 보기(레이아웃의 다른 항목 포함)가 외부 레이아웃의 둥근 모양으로 잘립니다.

흰색 배경, 검은색 테두리, 둥근 모서리로 그림 그리기를 위한 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)

Android v7 지원 라이브러리에서 CardView를 사용합니다.조금 무겁지만, 모든 문제를 해결하고 충분히 쉽습니다.설정된 그리기 가능한 배경 방법과 달리 하위 뷰를 성공적으로 클리핑할 수 있습니다.

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

나는 다음과 같은 방법을 수행했습니다.

스크린샷 확인:

Relative layout Background

이름을 지정한 그리기 가능한 파일 만들기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);

다 했어요.

두 가지를 통합하는 것이 더 좋은 방법이라고 생각합니다.

  1. 여기에 표시된 대로 레이아웃의 비트맵을 만듭니다.

  2. 여기에 표시된 것처럼 비트맵에서 둥근 모양으로 그릴 수 있도록 합니다.

  3. 이미지에 그리기 가능한 항목을 설정합니다. 보기

이렇게 하면 코너가 있는 콘텐츠와 같이 다른 솔루션이 해결하지 못한 사례를 처리할 수 있습니다.

2개가 아닌 단일 레이어를 보여주기 때문에 GPU에 조금 더 친숙하다고 생각합니다.

더 나은 유일한 방법은 완전히 맞춤화된 보기를 만드는 것이지만, 그것은 많은 코드이고 많은 시간이 걸릴 수 있습니다.저는 제가 여기서 제안한 것이 두 세계의 최고라고 생각합니다.

다음은 이 작업을 수행하는 방법에 대한 일부입니다.

둥근 모서리 그리기 가능.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);
    }

}

편집: "라운드 코너스 레이아웃" 라이브러리를 기반으로 한 좋은 대안을 찾았습니다.반올림할 모든 레이아웃 클래스에 사용할 클래스를 지정합니다.

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

그리고 그 결과:

enter image description here

사용하는 경우 스트로크 가장자리에 약간의 아티팩트 문제가 있습니다(내용의 일부 픽셀이 남아 있음).확대해 보면 알 수 있습니다.저는 여기서 이 문제에 대해 보고했습니다.

EDIT: IDE에 고정되어 있는 것처럼 보이지만 IDE에는 없습니다.여기 보고됨.

1단계: drawables 폴더에 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>

배치를 반올림하려면 CardView를 사용하는 것이 가장 좋습니다. 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"를 사용하여 반경을 변경할 수 있습니다.

해보세요...

1.드로잉 가능한 xml(custom_drawable.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"

재료 구성요소 라이브러리를 사용하여 사용자 정의 모양을 그릴 수 있습니다.

선형 레이아웃을 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);

enter image description here

참고: 재료 구성 요소 라이브러리의 버전 1.1.0이 필요합니다.

가장 좋고 간단한 방법은 레이아웃에서 card_background를 그릴 수 있도록 하는 것입니다.이것은 또한 구글의 재료 설계 지침을 따릅니다.이를 선형 레이아웃에 포함하기만 하면 됩니다.

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>

코너 반경을 프로그래밍 방식으로 설정하는 기능

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

CardView를 사용하여 레이아웃의 모서리를 둥글게 만듭니다.카드 에 대해 card_view:cardCornerRadius="5dp"를 사용하여 배치 모서리를 둥글게 만듭니다.

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

더 나은 방법은 다음과 같습니다.

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 아래에서도 작동하며 다음과 같은 기능을 제공합니다.

Result


이 조금 더더 잘 , 당이조더노더력서해나통있할은면요다사세의제다하용음향, 을만약이를신금요▁if세사▁then,▁use하용다▁more음을 사용하세요.android.support.v7.widget.CardView그것과 함께cardCornerRadius set 성및집(합속및▁attribute))elevation 다리탓으에 대한 .0dp카드View)로 함께 제공되는 드롭 섀도우를 제거합니다.또한 이것은 API 수준에서 15까지 작동할 것입니다.

가능한 , "xml"을 .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"
<?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, 이미지 크기에 상관없이 테두리를 볼 수 있도록 스트로크와 동일한 값을 패딩하십시오.

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

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

<corners
    android:bottomLeftRadius="@dimen/_5sdp"
    android:bottomRightRadius="@dimen/_5sdp"
    android:topLeftRadius="@dimen/_5sdp"
    android:topRightRadius="@dimen/_5sdp" />

제가 @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>

파티에 조금 늦었지만, 이것은 여전히 문제입니다.그래서 xml에서 모서리를 잘라낼 수 있는 데이터 바인딩을 위한 OutlineProviders와 BindingAdapters를 작성했습니다.

참고: 윤곽이 있는 클리핑은 모서리의 크기를 다르게 할 수 없습니다!

저는 이 스택 오버플로 게시물에 코드로 자세한 응답을 작성했습니다.

코드 + 바인딩 어댑터로 얻을 수 있는 것:

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

이렇게 하면 뷰를 원, 모든 모서리를 둥글게 잘라내고 한 방향(왼쪽, 위, 오른쪽, 아래)으로 둥근 모서리를 잘라내거나 단일 모서리를 잘라낼 수 있습니다.

만약 여러분이 원하는 것이 단지 둥근 직사각형이라면, 긴 이야기를 짧게 자르세요.

float r=8;
ShapeDrawable shape = 
   new ShapeDrawable (new RoundRectShape(new float[] { r, r, r, r, r, r, r, r },null,null));
shape.getPaint().setColor(Color.RED);
view.setBackground(shape);

android rounded rectangle shape

  • 처음 두 개의 플로트는 왼쪽 상단 모서리에 대한 것입니다(나머지 쌍은 시계 방향으로 일치함).

자세한 내용은 이 답변참조하십시오.

둥근 앱 모음 및 둥근 하단 앱 모음과 같은 사용자 정의 보기를 사용하여 이 작업을 수행할 수 있습니다.여기서path에 익숙함clipPath캔버스

Round Corner View

언급URL : https://stackoverflow.com/questions/16161448/how-to-make-layout-with-rounded-corners