จะกำหนดรูปวงกลมในไฟล์ Android XML ที่สามารถวาดได้อย่างไร


687

ฉันมีปัญหาบางอย่างในการค้นหาเอกสารประกอบคำจำกัดความของรูปร่างใน XML สำหรับ Android ฉันต้องการกำหนดวงกลมอย่างง่ายที่เต็มไปด้วยสีทึบในไฟล์ XML เพื่อรวมไว้ในไฟล์เลย์เอาต์ของฉัน

น่าเสียดายที่ Documentation บน android.com ไม่ครอบคลุมคุณลักษณะ XML ของคลาส Shape ฉันคิดว่าฉันควรใช้ArcShapeเพื่อวาดวงกลม แต่ไม่มีคำอธิบายเกี่ยวกับวิธีการตั้งค่าขนาดสีหรือมุมที่จำเป็นในการสร้างวงกลมออกจากส่วนโค้ง


3
ที่นี่คุณสามารถอ่านเกี่ยวกับวิธีสร้างรูปร่างที่สามารถวาดได้: developer.android.com/guide/topics/resources/…
Mario Kutlev

คุณสามารถรับวงกลม xml ได้จากที่นี่developer.android.com/samples/WearSpeakerSample/res/drawable/
......

เอกสาร Android Dev ได้รับการปรับปรุงตั้งแต่นั้นมา ตอนนี้มันครอบคลุมandroid:shapeองค์ประกอบ - ทรัพยากร Drawable
naXa

คำตอบ:


1514

นี่เป็นวงกลมธรรมดาที่สามารถวาดได้ใน Android

<?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 คุณสามารถใช้ตัวกรองสีจากโค้ด Java (ดูคลาส Drawable)
milosmns

7
ฉันลองdpแล้วมันบิดเบี้ยวเป็นรูปวงรี สำหรับฉันใช้ptแทนแก้ไขมัน
Tyler

13
ไม่จำเป็นต้องใช้sizeใน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รูปร่างปรากฏเป็นวงกลมในตัวอย่างเหล่านี้มุมมองของคุณที่คุณใช้รูปร่างนี้เป็นพื้นหลังควรเป็นรูปสี่เหลี่ยมจัตุรัสหรือคุณต้องตั้งค่าheightและwidthคุณสมบัติของแท็กรูปร่างให้มีค่าเท่ากัน


2
ทางออกที่ดี แน่นอนว่าวงรีจะปรากฏเป็นวงกลมหากความกว้างและความสูงของมุมมองเท่ากัน ฉันคิดว่ามีวิธีที่จะทำให้มันปรากฏเป็นวงกลมไม่ว่าขนาดของมุมมองจะเป็นอย่างไร
Ferran Maylinch

2
@FerranMaylinch "ฉันคิดว่ามันมีวิธีทำให้มันดูเป็นวงกลมไม่ว่าขนาดของมุมมองจะเป็นอย่างไร" ฉันแก้ไขสิ่งนี้โดยใช้ RelativeLayout การตัดทั้ง ImageView (โดยมีวงกลมเป็น "src" drawable) ที่มีความกว้าง / ความสูงคงที่และ 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"
            หุ่นยนต์: มุม = "270" />
</ รูปร่าง>


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"ในการกำหนดเลย์เอาต์ของปุ่มของคุณ


+ เพิ่ม 'ขนาด' ให้กับรูปร่าง (ขึ้นอยู่กับ usecase)
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

ความละเอียด / 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

ฉันวาดวงกลมภายในข้อ จำกัด ไม่ได้ด้วยเหตุผลบางอย่างฉันแค่ใช้คำตอบใด ๆ ข้างต้นไม่ได้

สิ่งที่ทำงานได้อย่างสมบูรณ์คือ TextView แบบง่ายพร้อมข้อความที่ออกมาเมื่อคุณกด "Alt + 7":

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

ฉลาดมาก! ฉันแน่ใจว่าบางคนจะพบว่ามีประโยชน์นี้
Scott Biggs

มีประโยชน์มากมาก ..
Mahbubur เราะห์มานข่าน

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

รูปทรงวงกลมในไฟล์ XML ที่ใช้ Android ได้

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

ภาพหน้าจอ

ป้อนคำอธิบายรูปภาพที่นี่


-22

เพียงแค่ใช้

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

26
และฉันจะตั้งเป็น src ของ ImageView ในไฟล์เลย์เอาต์ XML ของฉันได้อย่างไร?
Janusz

นี่ไม่สามารถใช้งานได้โดยตรงกับรหัสเลย์เอาต์ xml
François Legrand

1
มันใช้งานได้จริง ขอบคุณ :) พื้นหลัง val = ShapeDrawable (OvalShape ()) background.paint.color = ContextCompat.getColor (holder.getView (). บริบทบริบท R.color.green) ชั้น val = arrayOf (พื้นหลังทรัพยากร !!) greenRoundIcon.setImageDrawable (LayerDrawable (เลเยอร์))
David

ไม่ชอบ แต่ก็ใช้งานได้และช่วยฉันได้ขอบคุณ
Pavel Shorokhov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.