È possibile disegnare un bordo attorno a una visualizzazione di testo?
È possibile disegnare un bordo attorno a una visualizzazione di testo?
Risposte:
È possibile impostare una forma tracciabile (un rettangolo) come sfondo per la vista.
<TextView android:text="Some text" android:background="@drawable/back"/>
E rettangolo draw.back.xml (messo nella cartella res / drawable):
<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>
È possibile utilizzare @android:color/transparent
per il colore solido per avere uno sfondo trasparente. Puoi anche usare il riempimento per separare il testo dal bordo. per ulteriori informazioni consultare: http://developer.android.com/guide/topics/resources/drawable-resource.html
Consentitemi di riassumere alcuni diversi metodi (non programmatici).
Salvare quanto segue come file XML nella cartella di disegno (ad esempio, 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>
Quindi impostalo come sfondo per TextView:
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_border" />
Altro aiuto:
Una patch 9 è un'immagine di sfondo estensibile. Se crei un'immagine con un bordo, questo darà a TextView un bordo. Tutto quello che devi fare è creare l'immagine e quindi impostarla sullo sfondo in TextView.
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_ninepatch_image" />
Ecco alcuni link che mostreranno come creare un'immagine a 9 patch:
Utilizzando un elenco di livelli
È possibile utilizzare un elenco di livelli per impilare due rettangoli uno sopra l'altro. Rendendo il secondo rettangolo leggermente più piccolo del primo rettangolo, puoi creare un effetto bordo. Il primo rettangolo (inferiore) è il colore del bordo e il secondo rettangolo è il colore di sfondo.
<?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>
L'impostazione android:top="2dp"
compensa la parte superiore (la rende più piccola) di 2dp. Ciò consente al primo rettangolo (inferiore) di mostrare, dando un effetto bordo. Puoi applicarlo allo sfondo TextView nello stesso modo in cui è shape
stato fatto il disegno sopra.
Ecco alcuni altri collegamenti sugli elenchi di livelli:
Usando una patch 9
Puoi semplicemente creare un'immagine a 9 patch con un singolo bordo. Tutto il resto è lo stesso di cui sopra.
Utilizzando una vista
Questo è un trucco, ma funziona bene se devi aggiungere un separatore tra due viste o un bordo a un singolo TextView.
<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>
Ecco alcuni altri link:
border: 1px solid #999;
non si suppone che sia così complicato.
Il modo semplice è aggiungere una vista per TextView. Esempio per la linea di confine inferiore:
<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>
Per i bordi delle altre direzioni, regolare la posizione della vista del separatore.
Ho risolto questo problema estendendo la visualizzazione del testo e disegnando un bordo manualmente. Ho anche aggiunto in modo da poter selezionare se un bordo è punteggiato o tratteggiato.
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;
}
}
E la classe di confine:
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;
}
}
Spero che questo aiuti qualcuno :)
Stavo solo guardando una risposta simile: è possibile farlo con un colpo e la seguente sostituzione:
@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);
}
È possibile impostare il bordo con due metodi. Uno è disegnabile e il secondo è programmatico.
<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>
Programmatico
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;
}
La soluzione più semplice che ho trovato (e che funziona davvero):
<TextView
...
android:background="@android:drawable/editbox_background" />
Ho trovato un modo migliore per mettere un bordo attorno a TextView.
Usa un'immagine a nove patch per lo sfondo. È piuttosto semplice, l'SDK è dotato di uno strumento per creare l'immagine a 9 patch e non prevede assolutamente alcuna codifica.
Il link è http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch .
Puoi aggiungere qualcosa del genere nel tuo codice:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#ffffff" />
<stroke android:width="1dip" android:color="#4fa5d5"/>
</shape>
Controlla il link in basso per creare gli angoli arrotondati http://androidcookbook.com/Recipe.seam?recipeId=2318
La cartella disegnabile, sotto res, in un progetto Android non è limitata alle bitmap (file PNG o JPG), ma può anche contenere forme definite in file XML.
Queste forme possono quindi essere riutilizzate nel progetto. Una forma può essere utilizzata per mettere un bordo attorno a un layout. Questo esempio mostra un bordo rettangolare con angoli curvi. Un nuovo file chiamato customborder.xml viene creato nella cartella dei disegni (in Eclipse utilizzare il menu File e selezionare Nuovo, quindi File, con la cartella dei disegni selezionata digitare il nome del file e fare clic su Fine).
Viene inserito l'XML che definisce la forma del bordo:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="20dp"/>
<padding android:left="10dp" android:right="10dp" android:top="10dp" android:bottom="10dp"/>
<solid android:color="#CCCCCC"/>
</shape>
L'attributo android:shape
è impostato su rettangolo (i file di forma supportano anche ovale, linea e anello). Rettangolo è il valore predefinito, quindi questo attributo potrebbe essere tralasciato se si sta definendo un rettangolo. Consulta la documentazione di Android sulle forme su http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape per informazioni dettagliate su un file di forme.
Gli angoli dell'elemento imposta gli angoli del rettangolo da arrotondare. È possibile impostare un raggio diverso su ciascun angolo (consultare il riferimento Android).
Gli attributi di riempimento vengono utilizzati per spostare i contenuti della vista a cui viene applicata la forma, per evitare che i contenuti si sovrappongano al bordo.
Il colore del bordo qui è impostato su un grigio chiaro (valore RGB esadecimale CCCCCC).
Le forme supportano anche i gradienti, ma qui non viene utilizzato. Ancora una volta, vedi le risorse Android per vedere come viene definito un gradiente. La forma viene applicata al laypout usando android:background="@drawable/customborder"
.
All'interno del layout è possibile aggiungere altre viste come di consueto. In questo esempio è stato aggiunto un singolo TextView e il testo è bianco (RGB esadecimale FFFFFF). Lo sfondo è impostato su blu, oltre a un po 'di trasparenza per ridurre la luminosità (valore alfa RGB esadecimale A00000FF). Infine, il layout viene spostato dal bordo dello schermo posizionandolo in un altro layout con una piccola quantità di riempimento. Il file di layout completo è quindi:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/customborder">
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Text View"
android:textSize="20dp"
android:textColor="#FFFFFF"
android:gravity="center_horizontal"
android:background="#A00000FF" />
</LinearLayout>
</LinearLayout>
Ho un modo per farlo in modo molto semplice e vorrei condividerlo.
Quando voglio quadrare le TextView, le inserisco semplicemente in un LinearLayout. Ho impostato il colore di sfondo del mio LinearLayout e ho aggiunto un margine al mio TextView. Il risultato è esattamente come se si quadrasse TextView.
Cambiare la risposta di Konstantin Burov perché non funziona nel mio caso:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
<stroke android:width="2dip" android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
</selector>
compileSdkVersion 26 (Android 8.0), minSdkVersion 21 (Android 5.0), targetSdkVersion 26, implementazione 'com.android.support:appcompat-v7:26.1.0', grado: 4.1
È possibile creare uno sfondo personalizzato per la visualizzazione del testo. Passaggi 1. Vai al tuo progetto. 2. Vai a risorse e fai clic con il pulsante destro del mouse su drawable. 3. Fare clic su Nuovo -> File di risorse estraibile 4. Assegnare il nome al file 5. Incollare il seguente codice nel file
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="1dp" android:color="@color/colorBlack" />
<padding android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
<corners android:radius="6dp" />
<solid android:color="#ffffffff" />
Per la visualizzazione del testo in cui si desidera utilizzarlo come backgroud,
Android: background = "@ drawable / your_fileName"
Ecco la mia "semplice" classe di supporto che restituisce un ImageView con il bordo. Rilascialo nella cartella utils e chiamalo così:
ImageView selectionBorder = BorderDrawer.generateBorderImageView(context, borderWidth, borderHeight, thickness, Color.Blue);
Ecco il codice
/**
* Because creating a border is Rocket Science in Android.
*/
public class BorderDrawer
{
public static ImageView generateBorderImageView(Context context, int borderWidth, int borderHeight, int borderThickness, int color)
{
ImageView mask = new ImageView(context);
// Create the square to serve as the mask
Bitmap squareMask = Bitmap.createBitmap(borderWidth - (borderThickness*2), borderHeight - (borderThickness*2), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(squareMask);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
canvas.drawRect(0.0f, 0.0f, (float)borderWidth, (float)borderHeight, paint);
// Create the darkness bitmap
Bitmap solidColor = Bitmap.createBitmap(borderWidth, borderHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(solidColor);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
canvas.drawRect(0.0f, 0.0f, borderWidth, borderHeight, paint);
// Create the masked version of the darknessView
Bitmap borderBitmap = Bitmap.createBitmap(borderWidth, borderHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(borderBitmap);
Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawBitmap(solidColor, 0, 0, null);
canvas.drawBitmap(squareMask, borderThickness, borderThickness, clearPaint);
clearPaint.setXfermode(null);
ImageView borderView = new ImageView(context);
borderView.setImageBitmap(borderBitmap);
return borderView;
}
}
selectionBorder
?
Questo può aiutarti.
<RelativeLayout
android:id="@+id/textbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@android:color/darker_gray" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="3dp"
android:background="@android:color/white"
android:gravity="center"
android:text="@string/app_name"
android:textSize="20dp" />
</RelativeLayout
Creare una vista del bordo con il colore di sfondo come colore del bordo e dimensione della vista di testo. imposta il riempimento della vista del bordo come larghezza del bordo. Imposta il colore di sfondo della vista di testo come colore desiderato per la vista di testo. Ora aggiungi la visualizzazione del testo all'interno della visualizzazione del bordo.
Prova questo:
<shape>
<solid android:color="@color/txt_white"/>
<stroke android:width="1dip" android:color="@color/border_black"/>
</shape>
Esistono molti modi per aggiungere un bordo a un textView. Il più semplice è creando un disegno personalizzato e impostandolo come android:background="@drawable/textview_bg"
per textView.
Textview_bg.xml andrà in Drawables e può essere qualcosa del genere. Puoi avere uno solid
o uno gradient
sfondo (o niente se non richiesto), corners
per aggiungere un raggio d'angolo estroke
aggiungere un bordo.
textview_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="@dimen/dp_10"/>
<gradient
android:angle="225"
android:endColor="#FFFFFF"
android:startColor="#E0E0E0" />
<stroke
android:width="2dp"
android:color="#000000"/>
</shape>
setBackground sulla tua visualizzazione di testo XML,
aggiungi il file arrotondato_textview.xml nella tua directory disegnabile.
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/white" />
<stroke android:width="2dip" android:color="#4f5g52"/>
</shape>
imposta file disegnabili in background textView.
In realtà, è molto semplice. Se si desidera un semplice rettangolo nero dietro la visualizzazione di testo, è sufficiente aggiungere android:background="@android:color/black"
all'interno dei tag TextView. Come questo:
<TextView
android:textSize="15pt" android:textColor="#ffa7ff04"
android:layout_alignBottom="@+id/webView1"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:background="@android:color/black"/>