Android XML 드로어 블 파일에서 원 모양을 정의하는 방법은 무엇입니까?


687

Android 용 XML에서 도형 정의 문서를 찾는 데 문제가 있습니다. XML 파일에 단색으로 채워진 간단한 원을 정의하여 레이아웃 파일에 포함시키고 싶습니다.

안타깝게도 android.com의 설명서에는 Shape 클래스의 XML 속성이 포함되어 있지 않습니다. 원을 그리 려면 ArcShape 을 사용해야한다고 생각 하지만 원호를 아크에서 만드는 데 필요한 크기, 색상 또는 각도를 설정하는 방법에 대한 설명은 없습니다.


3
셰이프 드로어 블을 만드는 방법에 대해 읽을 수 있습니다. developer.android.com/guide/topics/resources/…
Mario Kutlev


그 이후로 Android Dev 설명서가 개선되었습니다. 이제 android:shape요소 드로어 블 리소스를 다룹니다 .
naXa

답변:


1514

이것은 안드로이드에서 드로어 블과 같은 간단한 원입니다.

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

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

   <size 
       android:width="120dp"
        android:height="120dp"/>
</shape>

51
그리고 색상을 동적으로 변경하는 방법은 무엇입니까?
Ankit Garg

5
@AnkitGarg 당신은 자바 코드에서 컬러 필터를 적용 할 수 있습니다 (드로어 블 클래스 참조)
milosmns

7
나는 시도 dp하고 타원형 모양으로 왜곡되었습니다. 나를 위해 pt대신 고정 하여 사용 하십시오.
Tyler

13
나중에보기의 정사각형 크기를 정의하는 경우 sizein이 필요하지 않습니다 shape.
Ferran Maylinch

2
그 모양은 타원형이며 둥글 지 않습니다. 누구나 확인할 수 있습니까 ??
Tarun

762

이것을 뷰 배경으로 설정

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <stroke
        android:width="1dp"
        android:color="#78d9ff"/>
</shape>

여기에 이미지 설명을 입력하십시오

실선 사용 :

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid
        android:color="#48b3ff"/>
</shape>

여기에 이미지 설명을 입력하십시오

스트로크가있는 솔리드 :

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#199fff"/>
    <stroke
        android:width="2dp"
        android:color="#444444"/>
</shape>

여기에 이미지 설명을 입력하십시오

참고 :oval 이 예제에서 모양을 원으로 표시 이 모양을 배경으로 사용하고있는보기는 사각형이어야하거나 모양 태그 의 heightwidth속성을 같은 값 으로 설정해야 합니다.


2
좋은 해결책. 물론 타원은 뷰의 너비와 높이가 동일하면 원으로 나타납니다. 뷰의 크기에 관계없이 원으로 표시하는 방법이 있다고 생각합니다.
Ferran Maylinch

2
@FerranMaylinch "보기의 크기에 관계없이 원으로 표시하는 방법이 있다고 생각합니다." 고정 너비 / 높이로 ImageView (원이 "src"드로어 블임)를 감싸는 RelativeLayout과 텍스트를 감싸는 TextView (예 : 텍스트)를 모두 사용하여이 문제를 해결했습니다.
Michele

나는 똑같은 일을하고 있지만 원은 타원으로 그려집니다
버그는

런타임에 다른 테두리 색상으로 텍스트 뷰를 중심으로 만들려면 어떻게해야합니까?
Anshul Tyagi

@AnshulTyagi 전화를 걸고 yourView.getBackground()수동으로 색상을 설정하여 그렇게 할 수 있다고 생각합니다 . 적절한 유형으로 캐스팅해야합니다 ShapeDrawable. 이에 관한 SO에 관한 질문이 있습니다.
M. Reza Nasirloo

93

간단한 원을위한 코드

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
        <solid android:color="#9F2200"/>
        <stroke android:width="2dp" android:color="#fff" />
        <size android:width="80dp" android:height="80dp"/>
</shape>

46

Android SDK 샘플을 살펴보십시오. ApiDemos 프로젝트에는 몇 가지 예가 있습니다.

/ ApiDemos / res / drawable /

  • black_box.xml
  • shape_5.xml
  • 기타

그래디언트 채우기가있는 원의 경우 다음과 같이 표시됩니다.

<? xml version = "1.0"encoding = "utf-8"?>
<shape xmlns : android = "http://schemas.android.com/apk/res/android"android : shape = "oval">
    <gradient android : startColor = "# FFFF0000"android : endColor = "# 80FF00FF"
            android : angle = "270"/>
</ shape>


46

아래와 같이 VectorDrawable 을 사용할 수 있습니다 .

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="200dp"
    android:height="200dp"
    android:viewportHeight="64"
    android:viewportWidth="64">

    <path
        android:fillColor="#ff00ff"
        android:pathData="M22,32
        A10,10 0 1,1 42,32
        A10,10 0 1,1 22,32 Z" />
</vector>

위의 XML은 다음과 같이 렌더링됩니다.

여기에 이미지 설명을 입력하십시오


안녕하세요, 원과 뷰포트 사이에 패딩이 있습니다. 당신이 나를 도울 수 있습니까?
Ajeet

1
@Ajeet 당신은 뷰포트의 크기를 변경할 수 있고 당신은 경로를 그룹 안에 넣고 번역과 스케일을 지정할 수 있습니다<group android:translateX="-10" android:translateY="15"><path ...
Boris Treukhov

2
@Riyas pathData 부분을 설명 할 수 있습니까? 그 좌표가 의미하는 바는 무엇입니까?
Darshan Miskin

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

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

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

    <!-- corners -->
    <corners
        android:radius="2dp"/>
</shape>

1
<corners />타원형으로 무엇을합니까 (내 생각에는 모서리가 없음)?
Scott Biggs

18

당신이 원하는 경우 이 등이

여기에 이미지 설명을 입력하십시오

아래 코드를 사용해보십시오.

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="2"
    android:useLevel="false" >
    <solid android:color="@android:color/white" />
    <stroke
        android:width="1dp"
        android:color="@android:color/darker_gray" />
</shape>

17

프리 머티리얼에 대한 간단한 circle_background.xml은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="@color/color_accent_dark" />
        </shape>
    </item>
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/color_accent" />
        </shape>
    </item>
</selector>

'android:background="@drawable/circle_background"버튼의 레이아웃 정의에서 속성과 함께 사용할 수 있습니다


+ 셰이프에 '크기'를 추가합니다 (사용 사례에 따라 다름).
TouchBoarder

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

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

    <gradient
        android:startColor="@color/red"
        android:centerColor="@color/red"
        android:endColor="@color/red"
        android:angle="270"/>

    <size 
        android:width="250dp" 
        android:height="250dp"/>
</shape>

7

res / drawble / circle_shape.xml

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

        <shape android:shape="oval">
            <solid android:color="#e42828"/>
            <stroke android:color="#3b91d7" android:width="5dp"/>
            <!-- Set the same value for both width and height to get a circular shape -->
            <size android:width="250dp" android:height="250dp"/>
        </shape>
    </item>
</selector>

여기에 이미지 설명을 입력하십시오


4

당신은 이것을 시도 할 수 있습니다-

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="700"
    android:thickness="100dp"
    android:useLevel="false">

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

</shape>

또한을 조정하여 원의 반지름을 조정할 수 있습니다 android:thickness.

여기에 이미지 설명을 입력하십시오


정말 좋습니다! 속성이 직관적이지 않기 때문에 확실히 약간의 시간이 걸립니다. 매번 테두리에 멋진 빈 원을 표시하도록했습니다. 패딩을 사용하여 전체 원이 표시되도록 할 수 있습니다.
Scott Biggs

2

어떤 이유로 ConstraintLayout 안에 원을 그릴 수 없었습니다. 위의 답변을 사용할 수 없었습니다.

완벽하게 작동 한 것은 "Alt + 7"을 누를 때 나오는 텍스트가있는 간단한 TextView입니다.

 <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0075bc"
            android:textSize="40dp"
            android:text="•"></TextView>

매우 영리한! 누군가가 이것을 유용하게 사용할 것이라고 확신합니다.
Scott Biggs

매우 유용하고 훌륭합니다 ..
Mahbubur Rahman Khan

1

이것을 사용해보십시오

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

<item>
    <shape
        android:innerRadius="0dp"
        android:shape="ring"
        android:thicknessRatio="2"
        android:useLevel="false" >
        <solid android:color="@color/button_blue_two" />
    </shape>
</item>

텍스트 뷰에 이것을 사용하는 경우 너비와 높이 종횡비를 신경 쓰지 않아도됩니다.


0
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/text_color_green"/>
            <!-- Set the same value for both width and height to get a circular shape -->
            <size android:width="250dp" android:height="250dp"/>
        </shape>
    </item>
</selector>

0

Android XML 드로어 블 파일의 원 모양

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@android:color/white" />
    <stroke
        android:width="1.5dp"
        android:color="@android:color/holo_red_light" />
    <size
        android:width="120dp"
        android:height="120dp" />
</shape>

스크린 샷

여기에 이미지 설명을 입력하십시오


-23

그냥 사용

ShapeDrawable circle = new ShapeDrawable( new  OvalShape() );

26
그리고 XML 레이아웃 파일에서 ImageView의 src로 어떻게 설정할 수 있습니까?
Janusz

이것은 XML 레이아웃 코드에는 직접 적용되지 않습니다
François Legrand

1
이것은 실제로 작동합니다. 감사합니다 :) val background = ShapeDrawable (OvalShape ()) background.paint.color = ContextCompat.getColor (holder.getView (). context, R.color.green) val layer = arrayOf (background, resource !!) greenRoundIcon.setImageDrawable (LayerDrawable (layers))
David

매우 싫어하지만 효과가 있으며 도움이됩니다
Pavel Shorokhov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.