Wie kann ich einen Rand für ein ImageView
setzen und dessen Farbe in Android ändern?
Ich habe die folgende XML-Datei in den Hintergrund der Bildansicht als Zeichenbar gesetzt. Es klappt.
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="#FFFFFF" />
<stroke Android:width="1dp" Android:color="#000000" />
<padding Android:left="1dp" Android:top="1dp" Android:right="1dp"
Android:bottom="1dp" />
</shape>
Und dann Android:background="@drawable/yourXmlFileName"
zu deiner ImageView
hinzufügen
Nachfolgend ist der Code, den ich früher mit schwarzem Rand hatte. Beachten Sie, dass ich keine zusätzliche XML-Datei für den Rand verwendet habe.
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/red_minus_icon"
Android:background="#000000"
Android:padding="1dp"/>
Dies ist ein alter Beitrag, den ich kenne, aber ich dachte, das könnte jemandem da draußen helfen.
Wenn Sie einen durchscheinenden Rahmen simulieren möchten, der die "feste" Farbe der Form nicht überlappt, verwenden Sie diesen in Ihrer XML-Datei. Beachten Sie, dass ich hier nicht das Tag "Strich" verwende, da es scheinbar immer die tatsächlich gezeichnete Form überlappt.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<shape Android:shape="rectangle" >
<solid Android:color="#55111111" />
<padding
Android:bottom="10dp"
Android:left="10dp"
Android:right="10dp"
Android:top="10dp" />
<corners Android:radius="5dp" />
</shape>
</item>
<item>
<shape Android:shape="rectangle" >
<padding
Android:bottom="5dp"
Android:left="5dp"
Android:right="5dp"
Android:top="5dp" />
<solid Android:color="#ff252525" />
</shape>
</item>
</layer-list>
ImageView
in der XML-Datei
<ImageView
Android:id="@+id/myImage"
Android:layout_width="100dp"
Android:layout_height="100dp"
Android:padding="1dp"
Android:scaleType="centerCrop"
Android:cropToPadding="true"
Android:background="@drawable/border_image"
Android:src="@drawable/ic_launcher" />
speichern Sie den folgenden Code mit dem Namen border_image.xml, und es sollte sich in einem zeichnbaren Ordner befinden
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<gradient Android:startColor="#ffffff"
Android:endColor="#ffffff"
Android:angle="270" />
<corners Android:radius="0dp" />
<stroke Android:width="0.7dp" Android:color="#b4b4b4" />
</shape>
wenn Sie dem Bildrand eine abgerundete Ecke geben möchten, können Sie eine Zeile in der Datei border.xml ändern
<corners Android:radius="4dp" />
Fügen Sie einen Hintergrund hinzu, der wie res/drawables/background.xml gezeichnet werden kann:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="@Android:color/white" />
<stroke Android:width="1dp" Android:color="@Android:color/black" />
</shape>
Aktualisieren Sie den ImageView-Hintergrund in res/layout/foo.xml:
...
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="1dp"
Android:background="@drawable/background"
Android:src="@drawable/bar" />
...
Schließen Sie die ImageView-Auffüllung aus, wenn Sie möchten, dass die Quelle über den Hintergrund gezeichnet wird.
Dies wurde oben verwendet, aber nicht ausschließlich erwähnt.
setCropToPadding(boolean)
If true, the image will be cropped to fit within its padding.
Dadurch wird die ImageView-Quelle so angepasst, dass sie in den Hintergrund der Auffüllung passt.
Über XML kann es wie folgt erstellt werden,
Android:cropToPadding="true"
sie müssen eine background.xml in res/drawable dieses Codes erstellen
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="#FFFFFF" />
<corners Android:radius="6dp" />
<stroke
Android:width="6dp"
Android:color="@Android:color/white" />
<padding
Android:bottom="6dp"
Android:left="6dp"
Android:right="6dp"
Android:top="6dp" />
</shape>
Für diejenigen, die eine benutzerdefinierte Umrandung und Form von ImageView suchen. Sie können Android-Shape-Bildansicht verwenden
Fügen Sie einfach compile 'com.github.siyamed:Android-shape-imageview:[email protected]'
zu Ihrem build.gradle
hinzu.
Und in Ihrem Layout verwenden.
<com.github.siyamed.shapeimageview.BubbleImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:src="@drawable/neo"
app:siArrowPosition="right"
app:siSquare="true"/>
In derselben XML, die ich als nächstes verwendet habe:
<RelativeLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="#ffffff" <!-- border color -->
Android:padding="3dp"> <!-- border width -->
<ImageView
Android:layout_width="160dp"
Android:layout_height="120dp"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true"
Android:scaleType="centerCrop" />
</RelativeLayout>
Ich fand es so viel einfacher, dies zu tun:
1) Bearbeiten Sie den Rahmen so, dass der Inhalt darin enthalten ist (mit dem 9patch-Werkzeug).
2) Platzieren Sie die ImageView
in einer Linearlayout
und legen Sie den Hintergrund oder die Farbe des Rahmens als Hintergrund für die Linearlayout
fest. Wenn Sie den Rahmen so einstellen, dass der Inhalt in sich ist, befindet sich Ihre ImageView
innerhalb des Rahmens (genau dort, wo Sie den Inhalt mit dem 9patch-Werkzeug festlegen).
Das Folgende ist meine einfachste Lösung für dieses langwierige Problem.
<FrameLayout
Android:layout_width="112dp"
Android:layout_height="112dp"
Android:layout_marginLeft="16dp" <!-- May vary according to your needs -->
Android:layout_marginRight="16dp" <!-- May vary according to your needs -->
Android:layout_centerVertical="true">
<!-- following imageView acts as the boarder which sitting in the background of our main container ImageView -->
<ImageView
Android:layout_width="112dp"
Android:layout_height="112dp"
Android:background="#000"/>
<!-- following imageView holds the image as the container to our image -->
<!-- layout_margin defines the width of our boarder, here it's 1dp -->
<ImageView
Android:layout_width="110dp"
Android:layout_height="110dp"
Android:layout_margin="1dp"
Android:id="@+id/itemImageThumbnailImgVw"
Android:src="@drawable/banana"
Android:background="#FFF"/> </FrameLayout>
In der folgenden Antwort habe ich es gut genug erklärt, bitte schaut euch das auch an!
Ich hoffe, das wird jemand anderem da draußen helfen!
Erstellen Sie eine XML-Datei (z. B. "frame_image_view.xml") mit folgendem Inhalt in Ihrem Zeichenordner:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<stroke
Android:width="@dimen/borderThickness"
Android:color="@color/borderColor" />
<padding
Android:bottom="@dimen/borderThickness"
Android:left="@dimen/borderThickness"
Android:right="@dimen/borderThickness"
Android:top="@dimen/borderThickness" />
<corners Android:radius="1dp" /> <!-- remove line to get sharp corners -->
</shape>
Ersetzen Sie @dimen/borderThickness
und @color/borderColor
durch das, was Sie möchten, oder fügen Sie die entsprechende Abmessung/Farbe hinzu.
Fügen Sie das Drawable als Hintergrund zu Ihrer ImageView hinzu:
<ImageView
Android:id="@+id/my_image_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/frame_image_view"
Android:cropToPadding="true"
Android:adjustViewBounds="true"
Android:scaleType="fitCenter" />
Sie müssen Android:cropToPadding="true"
verwenden, sonst hat die definierte Polsterung keine Auswirkung. Verwenden Sie alternativ Android:padding="@dimen/borderThickness"
in Ihrer ImageView, um dasselbe zu erreichen. Versuchen Sie Android:adjustViewBounds="true"
zu verwenden, wenn der Rahmen das übergeordnete Element statt Ihrer ImageView umrahmt.
Die einfachste Möglichkeit, die Rahmenfarbe im Code zu ändern, ist die Verwendung des Attributs tintBackgound.
ImageView img = findViewById(R.id.my_image_view);
img.setBackgroundTintList(ColorStateList.valueOf(Color.RED); // changes border color to red
oder
ImageView img = findViewById(R.id.my_image_view);
img.setBackgroundTintList(getColorStateList(R.color.newColor));
Vergessen Sie nicht, Ihr newColor
zu definieren.