Wie stelle ich den abgerundeten Eckenradius einer Farbe ein, die mit XML gezeichnet werden kann?


108

Auf der Android-Website gibt es einen Abschnitt über Farbzeichnungen . Das Definieren dieser Zeichen in XML sieht folgendermaßen aus:

<resources>
    <drawable name="solid_red">#f00</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
    <drawable name="solid_green">#f0f0</drawable>
</resources>

In der Java-API haben sie die folgende Methode, um abgerundete Ecken zu definieren:

setCornerRadius(float radius)

Gibt es eine Möglichkeit, die abgerundeten Ecken in der XML festzulegen?


Antworten:


319

Verwenden Sie das <shape>Tag, um ein in XML gezeichnetes Zeichen mit abgerundeten Ecken zu erstellen. (Mit dem Shape-Tag können Sie auch andere Aufgaben ausführen, z. B. einen Farbverlauf definieren.)

Hier ist eine Kopie einer XML-Datei, die ich in einer meiner Apps verwende, um eine Zeichnungsdatei mit weißem Hintergrund, schwarzem Rand und abgerundeten Ecken zu erstellen:

<?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:radius="7dp" /> 
</shape>

1
Wo kann ich diese Datei speichern und wie bekomme ich sie in meinen Java-Code? Danke
Shyam

7
Speichern Sie es als XML-Datei im Drawable-Verzeichnis und verwenden Sie es dann so, als würden Sie jedes Drawable (Symbol oder Ressourcendatei) unter Verwendung seines Ressourcennamens (R.drawable.your_xml_name) verwenden
Guillaume

30
In diesem speziellen Fall sind alle Radien gleich, also hätten Sie android verwenden können: radius = "7dp"
Will Kru

2
Der Layout-Renderer in Android Studio kann ihn auch nicht rendern, wenn Sie den Radius separat definieren (auch bei gleichen Werten) und die Warnung "Pat.isConvex wird nicht unterstützt" erhalten. Verwenden Sie einfach <Ecken android: radius = "7dp" />
Francesco Ambrosini

@shyam Sie können es als "Hintergrund" festlegen. Wenn Sie es in einer Textansicht verwenden, müssen Sie daran denken, für Anfang und Ende einen Abstand hinzuzufügen, damit der Text nicht durch die abgerundete Kante überfüllt wird
RowanPD

19

Die Antwort von mbaird funktioniert gut. Beachten Sie jedoch, dass es in Android einen Fehler zu geben scheint (mindestens 2.1). Wenn Sie den Radius einer einzelnen Ecke auf 0 setzen, werden alle Ecken auf 0 gesetzt (zumindest ist dies bei "dp" -Einheiten der Fall; ich habe es nicht getan versuche es nicht mit anderen Einheiten).

Ich brauchte eine Form, bei der die oberen Ecken abgerundet und die unteren Ecken quadratisch waren. Dies wurde erreicht, indem die Ecken, die ich quadratisch sein wollte, auf einen Wert eingestellt wurden, der etwas größer als 0: 0,1 dp war. Dies wird immer noch als quadratische Ecken dargestellt, erzwingt jedoch nicht, dass die anderen Ecken einen Radius von 0 haben.


hast du gerade 0.1 dp geschrieben? funktioniert es, ich brauche auch obere abgerundete Ecken und untere quadratische, das gleiche Problem, wie Sie gerade 1 dp verwendet haben, an den quadratischen Ecken und 10 dp an den runden, Sie haben Recht, es ist immer noch auffällig, aber gibt mir 90%, was ich will laut dokumentation die einstellung 0 an den ungerundeten ecken hätte funktionieren sollen.
codeScriber

Eigentlich ist es kein Fehler, es steht in der Dokumentation: developer.android.com/guide/topics/resources/…
Tsuharesu

1

Versuchen Sie es mit dem folgenden Code

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:bottomLeftRadius="30dp"
    android:bottomRightRadius="30dp"
    android:topLeftRadius="30dp"
    android:topRightRadius="30dp" />
<solid android:color="#1271BB" />

<stroke
    android:width="5dp"
    android:color="#1271BB" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" /></shape>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.