Ist es möglich, einen Rahmen um ein Android zu ziehen? TextView
?
Wie lege ich einen Rahmen um eine Android TextView?
Yamspog
Konstantin Burow
Sie können eine zeichbare Form (ein Rechteck) als Hintergrund für die Ansicht festlegen.
<TextView android:text="Some text" android:background="@drawable/back"/>
Und Rectangle drawable back.xml (im Ordner res/drawable abgelegt):
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/white" />
<stroke android:width="1dip" android:color="#4fa5d5"/>
</shape>
Sie können verwenden @android:color/transparent
damit die Volltonfarbe einen transparenten Hintergrund hat. Sie können auch Padding verwenden, um den Text vom Rahmen zu trennen. Weitere Informationen finden Sie unter: http://developer.android.com/guide/topics/resources/drawable-resource.html
-
Was ist, wenn ich nur den oberen Rand haben möchte?
– happyhardik
1. August 2012 um 17:55 Uhr
-
@whyoz Seine Methode fügt der Ansichtshierarchie unnötige Komplexität hinzu. Sie benötigen zwei zusätzliche Ansichten (einen Layout-Container und die Rahmenansicht), um diese Methode zu verwenden. Wenn Sie also viele Ansichten haben, denen Sie einen Rahmen hinzufügen müssen, wird Ihr Ansichtsbaum unüberschaubar.
– Konstantin Burov
28. März 2013 um 15:23 Uhr
-
@whyoz dennoch kann diese Methode über Stile und Themen angewendet werden, während die Methode von YongGu nicht auf diese Weise verwendet werden kann.
– Konstantin Burov
28. März 2013 um 15:25 Uhr
-
Für nur obere Grenzesiehe diese Frage.
– Schmerz
7. April 2014 um 3:01 Uhr
-
Sie können dieses Werkzeug verwenden http://shapes.softartstudio.com Drawables zu generieren.
– Arda Basoglu
17. November 2015 um 23:55 Uhr
Suragch
Lassen Sie mich einige verschiedene (nicht-programmatische) Methoden zusammenfassen.
Verwenden einer Form, die gezeichnet werden kann
Speichern Sie Folgendes als XML-Datei in Ihrem Drawable-Ordner (z. B. my_border.xml):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- View background color -->
<solid
android:color="@color/background_color" >
</solid>
<!-- View border color and width -->
<stroke
android:width="1dp"
android:color="@color/border_color" >
</stroke>
<!-- The radius makes the corners rounded -->
<corners
android:radius="2dp" >
</corners>
</shape>
Dann legen Sie es einfach als Hintergrund für Ihre TextView fest:
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_border" />
Mehr Hilfe:
- Shape Drawable (Android-Dokumentation)
- Tipps und Tricks für Android-Entwickler: XML Drawables (Teil I)
Mit einem 9-Patch
Ein 9-Patch ist ein dehnbares Hintergrundbild. Wenn Sie ein Bild mit einem Rand erstellen, erhält Ihre TextView einen Rand. Alles, was Sie tun müssen, ist, das Bild zu erstellen und es dann in Ihrer Textansicht in den Hintergrund zu stellen.
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_ninepatch_image" />
Hier sind einige Links, die zeigen, wie man ein 9-Patch-Bild erstellt:
- Zeichnen Sie 9-Patch
- Einfacher Neun-Patch-Generator
- Eine einfache Anleitung zu 9-Patch für die Android-Benutzeroberfläche
- Erstellen und Verwenden von 9-Patch-Images in Android
Was ist, wenn ich nur den oberen Rand haben möchte?
Verwendung einer Layer-Liste
Sie können eine Ebenenliste verwenden, um zwei Rechtecke übereinander zu stapeln. Indem Sie das zweite Rechteck etwas kleiner als das erste Rechteck machen, können Sie einen Randeffekt erzielen. Das erste (untere) Rechteck ist die Randfarbe und das zweite Rechteck ist die Hintergrundfarbe.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Lower rectangle (border color) -->
<item>
<shape android:shape="rectangle">
<solid android:color="@color/border_color" />
</shape>
</item>
<!-- Upper rectangle (background color) -->
<item android:top="2dp">
<shape android:shape="rectangle">
<solid android:color="@color/background_color" />
</shape>
</item>
</layer-list>
Einstellung android:top="2dp"
versetzt die Spitze (macht sie kleiner) um 2 dp. Dadurch kann das erste (untere) Rechteck durchscheinen, was einen Randeffekt ergibt. Sie können dies auf die gleiche Weise wie die auf den TextView-Hintergrund anwenden shape
drawable wurde oben getan.
Hier sind einige weitere Links zu Ebenenlisten:
- Die
von Android verstehen - Wie erstelle ich einen unteren Rand in einem zeichbaren XML-Selektor?
- Erstellen Sie Ränder in einer Android-Ansicht in drawable xml auf 3 Seiten?
Mit einem 9-Patch
Sie können einfach ein 9-Patch-Bild mit einem einzelnen Rahmen erstellen. Alles andere ist wie oben beschrieben.
Verwenden einer Ansicht
Dies ist eine Art Trick, aber es funktioniert gut, wenn Sie ein Trennzeichen zwischen zwei Ansichten oder einen Rahmen zu einer einzelnen TextView hinzufügen müssen.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- This adds a border between the TextViews -->
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@android:color/black" />
<TextView
android:id="@+id/textview2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Hier noch ein paar Links:
- So zeichnen Sie eine Linie in Android
- So platzieren Sie eine horizontale Trennlinie zwischen Bearbeitungstexten in einer Aktivität
- Wie füge ich in einem relativen Layout eine horizontale 1px-Linie über der Bildansicht hinzu?
-
Meine Güte, Mann, a
border: 1px solid #999;
soll nicht sein diese kompliziert.– Achschar
2. Februar 2018 um 23:51 Uhr
-
Was ist, wenn ich den Rand der Textansicht haben möchte, der auch einen Schatten- und Welleneffekt hat?
– Akash Dubey
16. März 2018 um 6:47 Uhr
-
@AkashDubey, Entschuldigung, das habe ich noch nie gemacht. Ich schlage vor, Sie probieren sie einzeln aus und kombinieren sie dann. Wenn Sie nicht weiterkommen, stellen Sie eine neue Frage zu Stack Overflow.
– Suragch
16. März 2018 um 7:44 Uhr
Junge Gu
Der einfache Weg ist, eine Ansicht für Ihre TextView hinzuzufügen. Beispiel für die untere Begrenzungslinie:
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:text="@string/title"
android:id="@+id/title_label"
android:gravity="center_vertical"/>
<View
android:layout_width="fill_parent"
android:layout_height="0.2dp"
android:id="@+id/separator"
android:visibility="visible"
android:background="@android:color/darker_gray"/>
</LinearLayout>
Für die anderen Richtungsgrenzen passen Sie bitte die Position der Trennansicht an.
-
Nach meiner Erfahrung hat diese Lösung auf alten Geräten einen leisen sichtbaren Einfluss auf die App-Performance.
– Roberto Lombardini
23. September 2013 um 13:16 Uhr
-
Dies ist aus Sicht der Inflation eine schreckliche Lösung. Sie erstellen 3 neue Ansichtselemente und fügen eine weitere Ebene in der Tiefe der Ansichtshierarchie hinzu
– Philipp
15. November 2013 um 23:26 Uhr
-
Schlechteste Lösung wegen Inflationsperspektive wie Philipp sagte. Wissen Sie, dass TextView ein spezielles XML-Tag hat, um genau das zu tun: Definieren Sie ein Bild, das links/rechts/oben/unten um Ihre TextView gezeichnet werden soll, und sie sind bekannt als android:drawable****
– Mathias Seguy Android2ee
2. Dezember 2016 um 11:06 Uhr
Ich habe dieses Problem gelöst, indem ich die Textansicht erweitert und manuell einen Rahmen gezogen habe. Ich habe sogar hinzugefügt, dass Sie auswählen können, ob ein Rand gepunktet oder gestrichelt ist.
public class BorderedTextView extends TextView {
private Paint paint = new Paint();
public static final int BORDER_TOP = 0x00000001;
public static final int BORDER_RIGHT = 0x00000002;
public static final int BORDER_BOTTOM = 0x00000004;
public static final int BORDER_LEFT = 0x00000008;
private Border[] borders;
public BorderedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public BorderedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BorderedTextView(Context context) {
super(context);
init();
}
private void init(){
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(4);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(borders == null) return;
for(Border border : borders){
paint.setColor(border.getColor());
paint.setStrokeWidth(border.getWidth());
if(border.getStyle() == BORDER_TOP){
canvas.drawLine(0, 0, getWidth(), 0, paint);
} else
if(border.getStyle() == BORDER_RIGHT){
canvas.drawLine(getWidth(), 0, getWidth(), getHeight(), paint);
} else
if(border.getStyle() == BORDER_BOTTOM){
canvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
} else
if(border.getStyle() == BORDER_LEFT){
canvas.drawLine(0, 0, 0, getHeight(), paint);
}
}
}
public Border[] getBorders() {
return borders;
}
public void setBorders(Border[] borders) {
this.borders = borders;
}
}
Und die Grenzklasse:
public class Border {
private int orientation;
private int width;
private int color = Color.BLACK;
private int style;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public int getStyle() {
return style;
}
public void setStyle(int style) {
this.style = style;
}
public int getOrientation() {
return orientation;
}
public void setOrientation(int orientation) {
this.orientation = orientation;
}
public Border(int Style) {
this.style = Style;
}
}
Hoffe das hilft jemandem 🙂
Einfachste Lösung, die ich gefunden habe (und die tatsächlich funktioniert):
<TextView
...
android:background="@android:drawable/editbox_background" />
-
Ist es möglich, dies von einem Ort aus auf alle Textansichten anzuwenden?
– Ian Warburton
27. Juli 2018 um 18:25 Uhr
-
Schön für einen Quickie. Dies kann aber je nach Version des laufenden Gerätes sehr ungewöhnliche Auswirkungen haben. Das liegt daran, dass Google ständig ändert, wie EditTexts aussehen (du musst in Mode bleiben!)
– SMBiggs
1. August 2019 um 16:51 Uhr
-
Ich bin mir nicht sicher, ob dies den Dunkelmodus unterstützt
– Kishore
13. März um 11:15 Uhr
Peter Mortensen
Sie können den Rahmen auf zwei Arten festlegen. Einer ist per drawable und der zweite ist programmatisch.
Verwenden von Drawable
<shape>
<solid android:color="@color/txt_white"/>
<stroke android:width="1dip" android:color="@color/border_gray"/>
<corners android:bottomLeftRadius="10dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="10dp"
android:topRightRadius="0dp"/>
<padding android:bottom="0dip"
android:left="0dip"
android:right="0dip"
android:top="0dip"/>
</shape>
Programmatisch
public static GradientDrawable backgroundWithoutBorder(int color) {
GradientDrawable gdDefault = new GradientDrawable();
gdDefault.setColor(color);
gdDefault.setCornerRadii(new float[] { radius, radius, 0, 0, 0, 0,
radius, radius });
return gdDefault;
}
-
Ist es möglich, dies von einem Ort aus auf alle Textansichten anzuwenden?
– Ian Warburton
27. Juli 2018 um 18:25 Uhr
-
Schön für einen Quickie. Dies kann aber je nach Version des laufenden Gerätes sehr ungewöhnliche Auswirkungen haben. Das liegt daran, dass Google ständig ändert, wie EditTexts aussehen (du musst in Mode bleiben!)
– SMBiggs
1. August 2019 um 16:51 Uhr
-
Ich bin mir nicht sicher, ob dies den Dunkelmodus unterstützt
– Kishore
13. März um 11:15 Uhr
Markus Bernstein
Ich habe mir gerade eine ähnliche Antwort angesehen – dies kann mit einem Schlaganfall und der folgenden Überschreibung erfolgen:
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Paint strokePaint = new Paint();
strokePaint.setARGB(255, 0, 0, 0);
strokePaint.setTextAlign(Paint.Align.CENTER);
strokePaint.setTextSize(16);
strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setStrokeWidth(2);
Paint textPaint = new Paint();
textPaint.setARGB(255, 255, 255, 255);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(16);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
canvas.drawText("Some Text", 100, 100, strokePaint);
canvas.drawText("Some Text", 100, 100, textPaint);
super.draw(canvas, mapView, shadow);
}
-
Toll! Meine einzige Sorge ist, dass der Strich an den Ecken hässlich ist, wenn ich drawRoundRect verwende, sowohl auf dem Telefon als auch im Emulator.
– Erdomester
15. Mai 2012 um 21:40 Uhr
-
@erdomester Vielleicht Paint StrokePaint = new Paint (Paint.ANTI_ALIAS_FLAG); wird das Problem “hässlich an den Ecken” lösen
– P-RAD
18. September 2015 um 0:05 Uhr
Ich habe hier eine schmutzige Lösung gepostet: stackoverflow.com/a/45242147/4291937
– Gregor Azbe
21. Juli 2017 um 16:09 Uhr
Schauen Sie sich meine einzeilige Antwort unten an.
– Vielfältig
21. April 2018 um 13:54 Uhr
Mit dem Materialkomponenten benutze einfach a
MaterialShapeDrawable
: stackoverflow.com/questions/18781902/…– Gabriele Mariotti
7. August 2020 um 8:40 Uhr