Bagaimana cara menentukan bentuk lingkaran dalam file yang dapat digambar Android XML?

687

Saya memiliki beberapa masalah dalam menemukan dokumentasi definisi bentuk dalam XML untuk Android. Saya ingin mendefinisikan lingkaran sederhana yang diisi dengan warna solid dalam File XML untuk memasukkannya ke dalam file layout saya.

Sayangnya Dokumentasi di android.com tidak mencakup atribut XML dari kelas Shape. Saya pikir saya harus menggunakan ArcShape untuk menggambar lingkaran tetapi tidak ada penjelasan tentang cara mengatur ukuran, warna, atau sudut yang diperlukan untuk membuat lingkaran keluar dari Arc.

Janusz
sumber
3
Di sini Anda dapat membaca tentang cara membuat shape drawable: developer.android.com/guide/topics/resources/…
Mario Kutlev
Anda bisa mendapatkan lingkaran xml dari sini developer.android.com/samples/WearSpeakerSample/res/drawable/…
Shahab Rauf
Dokumentasi Android Dev telah ditingkatkan sejak saat itu. Sekarang ia mencakup android:shapeelemen - Sumber daya yang dapat digambar .
naXa

Jawaban:

1513

Ini adalah lingkaran sederhana yang dapat digambar di 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>
Arefin
sumber
51
Dan bagaimana cara mengubah warna secara dinamis?
Ankit Garg
5
@AnkitGarg Anda dapat menerapkan filter warna dari kode Java (lihat kelas
Drawable
7
Saya mencoba dpdan itu terdistorsi menjadi bentuk oval. Bagi saya, menggunakan ptbukan memperbaikinya.
Tyler
13
Tidak perlu sizedi dalam shapejika nanti Anda menentukan ukuran persegi untuk tampilan.
Ferran Maylinch
2
Bentuknya oval dan tidak bulat. Adakah yang bisa mengkonfirmasi ??
Tarun
762

Jadikan ini sebagai latar belakang tampilan Anda

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

masukkan deskripsi gambar di sini

Untuk penggunaan lingkaran padat:

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

masukkan deskripsi gambar di sini

Padat dengan stroke:

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

masukkan deskripsi gambar di sini

Catatan : Untuk membuat ovalbentuk muncul sebagai lingkaran, dalam contoh ini, baik tampilan Anda bahwa Anda menggunakan bentuk ini sebagai latar belakangnya harus persegi atau Anda harus mengatur heightdan widthproperti tag bentuk ke nilai yang sama.

M. Reza Nasirloo
sumber
2
Solusi yang bagus. Tentu saja, oval muncul sebagai lingkaran jika lebar dan tinggi tampilan sama. Saya pikir ada cara untuk membuatnya tampak sebagai lingkaran tidak peduli ukuran tampilan.
Ferran Maylinch
2
@FerranMaylinch "Saya pikir ada cara untuk membuatnya tampak sebagai lingkaran tidak peduli ukuran tampilan." Saya memecahkan ini menggunakan RelativeLayout yang membungkus kedua ImageView (dengan lingkaran sebagai "src" drawable) dengan lebar tetap / tinggi dan TextView yang membungkus teks (misalnya).
Michele
Saya melakukan hal yang persis sama tetapi lingkarannya digambarkan sebagai oval
Bugs Happen
Bagaimana jika kita membutuhkannya untuk membuat di sekitar tampilan teks dengan warna perbatasan yang berbeda pada saat run time?
Anshul Tyagi
@AnshulTyagi Saya yakin Anda bisa melakukannya dengan menelepon yourView.getBackground()dan mengatur warna secara manual. Anda perlu melemparkannya ke jenis yang tepat seperti ShapeDrawable. Ada pertanyaan terkait pada SO tentang ini.
M. Reza Nasirloo
93

Kode untuk lingkaran sederhana

<?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>
Ravi Makvana
sumber
46

Lihat di sampel Android SDK. Ada beberapa contoh dalam proyek ApiDemos:

/ ApiDemos / res / drawable /

  • black_box.xml
  • shape_5.xml
  • dll

Ini akan terlihat seperti ini untuk lingkaran dengan isian gradien:

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

goosemanjack
sumber
46

Anda dapat menggunakan VectorDrawable seperti di bawah ini:

<?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 di atas diterjemahkan sebagai:

masukkan deskripsi gambar di sini

Riyas PK
sumber
Hei, saya memiliki bantalan antara lingkaran dan viewport. Bisakah Anda membantu saya?
Ajeet
1
@Ajeet Anda dapat mengubah ukuran viewport dan Anda dapat meletakkan path Anda di dalam grup dan menentukan terjemahan dan skala<group android:translateX="-10" android:translateY="15"><path ...
Boris Treukhov
2
@Riyas dapatkah Anda menjelaskan bagian pathData? apa yang tersirat dari koordinat tersebut?
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>
Ashana.Jackol
sumber
1
Apa yang <corners />dilakukan di oval (yang menurut saya tidak memiliki sudut)?
Scott Biggs
17

Berikut adalah circle_background.xml sederhana untuk pra-materi:

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

Anda dapat menggunakan dengan atribut 'android:background="@drawable/circle_background"dalam definisi tata letak tombol Anda

kip2
sumber
+ tambahkan 'ukuran' ke bentuk (tergantung pada usecase).
TouchBoarder
17

Jika Anda ingin lingkaran seperti ini

masukkan deskripsi gambar di sini

Coba gunakan kode di bawah ini:

<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>
Paraskevas Ntsounos
sumber
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>
TeeTracker
sumber
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>

masukkan deskripsi gambar di sini

Tienanhvn
sumber
4

Anda dapat mencoba ini -

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

Anda juga dapat menyesuaikan jari-jari lingkaran dengan menyesuaikan android:thickness.

masukkan deskripsi gambar di sini

krhitesh
sumber
Ini sangat bagus! Tentunya dibutuhkan beberapa permainan karena atributnya tidak intuitif. Saya berhasil mendapatkan ini untuk menampilkan lingkaran kosong yang bagus untuk perbatasan setiap waktu. Dan Anda dapat menggunakan padding untuk memastikan seluruh lingkaran ditampilkan.
Scott Biggs
2

Saya tidak bisa menggambar lingkaran di dalam ConstraintLayout saya karena suatu alasan, saya tidak bisa menggunakan jawaban di atas.

Apa yang berhasil dengan sempurna adalah TextView sederhana dengan teks yang keluar, ketika Anda menekan "Alt + 7":

 <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0075bc"
            android:textSize="40dp"
            android:text="•"></TextView>
Иво Недев
sumber
Sangat pintar! Saya yakin seseorang akan menemukan ini berguna.
Scott Biggs
sangat berguna, bagus ..
Mahbubur Rahman Khan
1

Anda dapat mencoba menggunakan ini

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

dan Anda tidak perlu repot dengan aspek rasio lebar dan tinggi jika Anda menggunakan ini untuk tampilan teks

Cyril David
sumber
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>
varun setia
sumber
0

bentuk lingkaran dalam file yang dapat ditarik 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>

Tangkapan layar

masukkan deskripsi gambar di sini

Aftab Alam
sumber
-23

Gunakan saja

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

sumber
26
Dan bagaimana saya bisa mengatur itu sebagai src dari ImageView di file layout XML saya?
Janusz
Ini tidak secara langsung berlaku untuk kode tata letak xml
François Legrand
1
ini sebenarnya berfungsi. Terima kasih :) val background = ShapeDrawable (OvalShape ()) background.paint.color = ContextCompat.getColor (holder.getView (). Context, R.color.green) lapisan val = arrayOf (latar belakang, sumber daya !!) greenRoundIcon.setImageDrawable (LayerDrawable (lapisan))
David
Sangat tidak disukai, tetapi berhasil dan itu membantu saya, terima kasih
Pavel Shorokhov