Làm cách nào để xác định hình dạng vòng tròn trong tệp có thể vẽ Android XML?


687

Tôi có một số vấn đề khi tìm tài liệu về các định nghĩa về hình dạng trong XML cho Android. Tôi muốn xác định một vòng tròn đơn giản chứa đầy màu sắc trong Tệp XML để đưa nó vào các tệp bố cục của mình.

Đáng buồn là Tài liệu trên android.com không bao gồm các thuộc tính XML của các lớp Shape. Tôi nghĩ rằng tôi nên sử dụng ArcShape để vẽ một vòng tròn nhưng không có lời giải thích nào về cách đặt kích thước, màu sắc hoặc góc cần thiết để tạo một vòng tròn ra khỏi Arc.


3
Tại đây bạn có thể đọc về cách tạo hình có thể vẽ được: developer.android.com/guide/topics/resource/
mẹo

Bạn có thể lấy vòng tròn xml từ đây developer.android.com/samples/WearSpeakerSample/res/drawable/
mẹo

Tài liệu Android Dev đã được cải thiện kể từ đó. Bây giờ nó bao gồm android:shapephần tử - Tài nguyên có thể vẽ .
naXa

Câu trả lời:


1512

Đây là một vòng tròn đơn giản như một hình vẽ trong 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
Và làm thế nào để thay đổi màu sắc linh hoạt?
Ankit Garg

5
@AnkitGarg bạn có thể áp dụng bộ lọc màu từ mã Java (xem lớp Drawable)
milosmns

7
Tôi đã thử dpvà nó bị biến dạng thành hình bầu dục. Đối với tôi, sử dụng ptthay vì cố định nó.
Tyler

13
Không cần sizetrong shapenếu sau này bạn xác định kích thước hình vuông cho chế độ xem.
Ferran Maylinch

2
Hình dạng của nó là hình bầu dục và không tròn. Bất cứ ai có thể xác nhận ??
Tarun

762

Đặt cái này làm nền xem của bạn

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

nhập mô tả hình ảnh ở đây

Đối với sử dụng vòng tròn rắn:

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

nhập mô tả hình ảnh ở đây

Rắn với đột quỵ:

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

nhập mô tả hình ảnh ở đây

Lưu ý : Để làm cho ovalhình dạng xuất hiện dưới dạng hình tròn, trong các ví dụ này, chế độ xem của bạn rằng bạn đang sử dụng hình dạng này làm hình nền phải là hình vuông hoặc bạn phải đặt heightwidthcác thuộc tính của thẻ hình dạng thành một giá trị bằng nhau.


2
Giải pháp tốt đẹp. Tất nhiên, hình bầu dục xuất hiện dưới dạng hình tròn nếu chiều rộng và chiều cao của chế độ xem là như nhau. Tôi nghĩ rằng có một cách để làm cho nó xuất hiện dưới dạng một vòng tròn bất kể kích thước của khung nhìn.
Ferran Maylinch

2
@FerranMaylinch "Tôi nghĩ rằng có một cách để làm cho nó xuất hiện dưới dạng một vòng tròn bất kể kích thước của chế độ xem." Tôi đã giải quyết vấn đề này bằng cách sử dụng RelativeLayout bao gồm cả ImageView (với vòng tròn là "src" có thể vẽ được) với chiều rộng / chiều cao cố định và TextView bao bọc một văn bản (ví dụ).
Michele

Tôi đang làm điều tương tự chính xác nhưng vòng tròn được vẽ là hình bầu dục
Bugs Happen

Điều gì sẽ xảy ra nếu chúng ta cần nó để tạo xung quanh một textview với các màu viền khác nhau trong thời gian chạy?
Anshul Tyagi

@AnshulTyagi Tôi tin rằng bạn có thể làm điều đó bằng cách gọi yourView.getBackground()và đặt màu thủ công. bạn cần phải đúc nó thành một loại thích hợp như thế nào ShapeDrawable. Có những câu hỏi liên quan về SO về điều này.
M. Reza Nasirloo

93

Mã cho vòng tròn đơn giản

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

Tìm trong các mẫu SDK Android. Có một số ví dụ trong dự án ApiDemos:

/ ApiDemos / res / drawable /

  • black_box.xml
  • shape_5.xml
  • Vân vân

Nó sẽ trông giống như thế này đối với một vòng tròn có tô màu gradient:

<? xml phiên bản = "1.0" mã hóa = "utf-8"?>
<hình dạng xmlns: android = "http://schemas.android.com/apk/res/android" android: shape = "oval">
    <gradient android: startColor = "# FFFF0000" android: endColor = "# 80FF00FF"
            android: angle = "270" />
</ hình dạng>


46

Bạn có thể sử dụng VectorDrawable như dưới đây:

<?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 ở trên biểu thị như sau:

nhập mô tả hình ảnh ở đây


Này, tôi đang có một phần đệm giữa vòng tròn và khung nhìn. Bạn có thể giúp tôi không?
Ajeet

1
@Ajeet bạn có thể thay đổi kích thước của khung nhìn và bạn có thể đặt đường dẫn của mình vào trong nhóm và chỉ định bản dịch và tỷ lệ<group android:translateX="-10" android:translateY="15"><path ...
Boris Treukhov

2
@Riyas bạn có thể giải thích phần pathData không? những gì tọa độ ngụ ý?
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
Làm gì <corners />trong một hình bầu dục (mà theo suy nghĩ của tôi không có góc)?
Scott Bigss

17

Đây là một circle_background.xml đơn giản cho tiền vật liệu:

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

Bạn có thể sử dụng với thuộc tính 'android:background="@drawable/circle_background"trong định nghĩa bố cục của nút của bạn


+ thêm 'kích thước' vào (các) hình dạng (tùy thuộc vào usecase).
TouchBoarder

17

Nếu bạn muốn một vòng tròn như thế này

nhập mô tả hình ảnh ở đây

Hãy thử sử dụng mã dưới đây:

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

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>

nhập mô tả hình ảnh ở đây


4

Bạn có thể thử điều này -

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

Ngoài ra, bạn có thể điều chỉnh bán kính của vòng tròn bằng cách điều chỉnh android:thickness.

nhập mô tả hình ảnh ở đây


Điều này thực sự tốt đẹp! Nó chắc chắn có một số chơi với các thuộc tính không trực quan. Tôi đã xoay sở để có được điều này để hiển thị một vòng tròn trống đẹp cho đường viền mỗi lần. Và bạn có thể sử dụng phần đệm để đảm bảo toàn bộ vòng tròn hiển thị.
Scott Bigss

2

Tôi không thể vẽ một vòng tròn bên trong ConstraintLayout của mình vì một số lý do, tôi chỉ không thể sử dụng bất kỳ câu trả lời nào ở trên.

Những gì đã làm việc hoàn hảo là một TextView đơn giản với văn bản xuất hiện, khi bạn nhấn "Alt + 7":

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

Rất thông minh! Tôi chắc chắn rằng ai đó sẽ tìm thấy điều này hữu ích.
Scott Biggie

rất hữu ích, thật tuyệt ..
Mahbubur Rahman Khan

1

Bạn có thể thử sử dụng cái này

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

và bạn không phải bận tâm đến tỷ lệ khung hình chiều rộng và chiều cao nếu bạn đang sử dụng tính năng này cho chế độ xem văn bản


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

hình dạng vòng tròn trong tệp có thể vẽ 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>

Ảnh chụp màn hình

nhập mô tả hình ảnh ở đây


-23

Chỉ dùng

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

26
Và làm cách nào tôi có thể đặt nó làm src của ImageView trong tệp bố cục XML của mình?
Janusz

Điều này không thể áp dụng trực tiếp cho mã bố cục xml
François Legrand

1
đây thực sự là công việc Cảm ơn :) val nền = ShapeDrawable (OvalShape ()) background.paint.color = ContextCompat.getColor (chủ.getView (). Bối cảnh, R.color.green) val layer = ArrayOf (nền, tài nguyên !!) greenRoundIcon.setImageDrawable (LayerDrawable (layer))
David

Rất không thích, nhưng nó hoạt động và nó giúp tôi, cảm ơn
Pavel Shorokhov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.