Ich versuche, eine Ansicht in Android mit abgerundeten Kanten zu machen. Die Lösung, die ich bisher gefunden habe, besteht darin, eine Form mit abgerundeten Ecken zu definieren und sie als Hintergrund für diese Ansicht zu verwenden.
Folgendes habe ich getan: Definiere ein Drawable wie folgt:
<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>
Jetzt habe ich dies wie folgt als Hintergrund für mein Layout verwendet:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:clipChildren="true"
android:background="@drawable/rounded_corner">
Das funktioniert einwandfrei, ich kann sehen, dass die Ansicht abgerundete Kanten hat.
Aber mein Layout enthält viele andere untergeordnete Ansichten, z. B. eine ImageView oder eine MapView
. Wenn ich ein ImageView
Bild innerhalb des obigen Layouts platziere, werden die Bildecken nicht abgeschnitten / beschnitten, sondern es erscheint voll.
Ich habe andere Problemumgehungen gesehen, damit es wie die hier erläuterte funktioniert .
Aber gibt es eine Methode, um abgerundete Ecken für eine Ansicht festzulegen, und alle untergeordneten Ansichten sind in dieser Hauptansicht enthalten, die abgerundete Ecken hat?
Antworten:
Ein anderer Ansatz besteht darin, eine benutzerdefinierte Layoutklasse wie die folgende zu erstellen. Dieses Layout zeichnet seinen Inhalt zuerst in eine Offscreen-Bitmap, maskiert die Offscreen-Bitmap mit einem abgerundeten Rechteck und zeichnet dann die Offscreen-Bitmap auf die tatsächliche Leinwand.
Ich habe es versucht und es scheint zu funktionieren (zumindest für meinen einfachen Testfall). Dies wirkt sich natürlich auf die Leistung im Vergleich zu einem normalen Layout aus.
Verwenden Sie dies wie ein normales Layout:
quelle
Oder Sie können ein
android.support.v7.widget.CardView
ähnliches verwenden:quelle
shape.xml
und in Ihrem Layout
quelle
Die Antwort von Jaap van Hengstum funktioniert hervorragend, aber ich denke, sie ist teuer. Wenn wir diese Methode beispielsweise auf eine Schaltfläche anwenden, geht der Berührungseffekt verloren, da die Ansicht als Bitmap gerendert wird.
Für mich besteht die beste und einfachste Methode darin, eine Maske auf die Ansicht anzuwenden:
quelle
Wenn Sie Probleme beim Hinzufügen von Touch-Listenern zum Layout haben. Verwenden Sie dieses Layout als übergeordnetes Layout.
wie
quelle
Erstellen Sie eine XML-Datei mit dem Namen
round.xml
imdrawable
Ordner und fügen Sie diesen Inhalt ein:Verwenden Sie dann die
round.xml
Optionbackground
für einen beliebigen Artikel. Dann gibt es Ihnen abgerundete Ecken.quelle
In Android L können Sie einfach View.setClipToOutline verwenden , um diesen Effekt zu erzielen. In früheren Versionen gibt es keine Möglichkeit, den Inhalt einer zufälligen ViewGroup in einer bestimmten Form zu schneiden.
Sie müssen an etwas denken, das Ihnen einen ähnlichen Effekt verleiht:
Wenn Sie in der ImageView nur abgerundete Ecken benötigen, können Sie das Bild mit einem Shader über die Form malen, die Sie als Hintergrund verwenden. Schauen Sie sich diese Bibliothek für ein Beispiel an.
Wenn wirklich wirklich alle Kinder abgeschnitten werden müssen, können Sie vielleicht eine andere Ansicht über Ihr Layout erstellen? Eine mit einem Hintergrund von welcher Farbe auch immer und einem runden Loch in der Mitte? Sie können tatsächlich eine benutzerdefinierte ViewGroup erstellen, die diese Form über alle untergeordneten Elemente zeichnet, die die onDraw-Methode überschreiben.
quelle
Folgen Sie diesem Tutorial und der gesamten Diskussion darunter - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
Laut diesem Beitrag von Guy Romain, einem der führenden Entwickler des gesamten Android UI-Toolkits, ist es möglich, einen Container (und alle seine untergeordneten Ansichten) mit abgerundeten Ecken zu erstellen, aber er erklärte, dass dies zu teuer sei (aufgrund von Leistungen von Rendering-Probleme).
Ich empfehle Ihnen, gemäß seinem Beitrag zu arbeiten. Wenn Sie abgerundete Ecken wünschen, implementieren Sie abgerundete Ecken
ImageView
gemäß diesem Beitrag. Dann können Sie es in einen Container mit einem beliebigen Hintergrund stellen und erhalten den gewünschten Effekt.das habe ich auch irgendwann auch gemacht.
quelle
Sie können ein
androidx.cardview.widget.CardView
ähnliches verwenden, um:ODER
shape.xml
und in Ihrem Layout
quelle
Erstellen Sie eine XML-Datei unter Ihrem Zeichenordner mit folgendem Code. (Der Name der von mir erstellten Datei lautet round_corner.xml)
round_corner.xml
Und halten diese
drawable
wiebackground
für die Ansicht , auf die Sie abgerundete Ecke Grenze halten wollen. Lassen Sie es uns für eine behaltenLinearLayout
quelle
Das
CardView
hat bei mir in API 27 in Android Studio 3.0.1 funktioniert. DascolorPrimary
wurde in derres/values/colors.xml
Datei referenziert und ist nur ein Beispiel. Die layout_width0dp
wird auf die Breite des übergeordneten Elements ausgedehnt . Sie müssen die Einschränkungen und die Breite / Höhe an Ihre Bedürfnisse anpassen.quelle
Unterschied zu Jaap van Hengstums Antwort:
quelle
quelle
Mit der Material Components Library können Sie am besten eine
View
mit abgerundeten Ecken erstellen, indem Sie dieMaterialShapeDrawable
.Erstellen Sie ein ShapeAppearanceModel mit benutzerdefinierten abgerundeten Ecken:
Erstellen Sie eine
MaterialShapeDrawable
:Wenn Sie auch eine ElevationOverlay für das dunkle Thema anwenden möchten, verwenden Sie Folgendes:
Optional: Wenden Sie auf die FormDrawable eine Hintergrundfarbe und einen Strich an
Wenden Sie schließlich das shapeDrawable als Hintergrund in Ihrer
LinearLayout
(oder einer anderen Ansicht) an:quelle
Der von Ihnen bereitgestellte Tutorial-Link scheint darauf hinzudeuten, dass Sie die Eigenschaften layout_width und layout_height Ihrer untergeordneten Elemente auf match_parent setzen müssen.
quelle
Probieren Sie diese Eigenschaft mit Ihrem linearen Layout aus. Sie hilft den
Tools: context = ". youractivity"
quelle
quelle
So erstellen Sie ein rundes Eckbild mit com.google.android.material: material: 1.2.0-beta01
oder wenn Sie es in einer XML-Datei verwenden möchten:
Fügen Sie in style.xml Folgendes hinzu:
quelle
Verwenden Sie die Form in XML mit dem Rechteck. Legen Sie die Eigenschaft des unteren oder oberen Radius wie gewünscht fest. Wenden Sie dann die XML als Hintergrund auf Ihre Ansicht an. Oder ... verwenden Sie Farbverläufe, um dies aus dem Code heraus zu tun.
quelle