android-layout menu - Come posso inserire un bordo attorno a una vista testo Android?




html activity (14)

Ho trovato un modo migliore per mettere un bordo attorno a un TextView.

Usa un'immagine a nove patch per lo sfondo. È piuttosto semplice, l'SDK ha uno strumento per realizzare l'immagine a 9 patch e non richiede assolutamente alcuna codifica.

Il collegamento è http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch .

È possibile tracciare un bordo attorno a una vista testo?


Puoi aggiungere qualcosa come questo 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>

Cambiando 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', gradle: 4.1


Ecco la mia classe helper "semplice" che restituisce un ImageView con il bordo. Basta rilasciarlo nella cartella utils e chiamarlo in questo modo:

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;
    }
}

Stavo solo guardando una risposta simile - è possibile farlo con un tratto e il seguente override:

@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); 
}

Questo potrebbe 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

Controlla il link sottostante per rendere gli angoli arrotondati http://androidcookbook.com/Recipe.seam?recipeId=2318

La cartella drawable, 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 drawable (in Eclipse utilizzare il menu File e selezionare Nuovo quindi File, con la cartella selezionabile selezionata nel nome del file e fare clic su Fine).

L'XML che definisce la forma del bordo è inserito:

<?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 shape supportano anche ovale, line e ring). Rectangle è il valore predefinito, quindi questo attributo potrebbe essere omesso se è definito un rettangolo. Consultare la documentazione di Android su forme su http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape per informazioni dettagliate su un file di forma.

Gli angoli dell'elemento impostano 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 il contenuto 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 le sfumature, ma qui non vengono utilizzate. Ancora una volta, vedi le risorse Android per vedere come viene definita una sfumatura. La forma è applicata al laypout usando android:background="@drawable/customborder" .

All'interno del layout è possibile aggiungere altre viste come di consueto. In questo esempio, è stata aggiunta una sola TextView e il testo è bianco (RGB esadecimale FFFFFF). Lo sfondo è impostato su blu, più un po 'di trasparenza per ridurre la luminosità (valore RGB alfanumerico esadecimale A00000FF). Infine, il layout viene spostato dal bordo dello schermo posizionandolo in un altro layout con una piccola quantità di padding. 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>

Il modo semplice è aggiungere una vista per il tuo 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 dell'altra direzione, regola la posizione della vista separatore.


Ho un modo per farlo molto semplice e mi piacerebbe condividerlo.

Quando voglio quadrare mi TextViews, li ho appena messi in un LinearLayout. Ho impostato il colore di sfondo del mio LinearLayout e aggiungo un padding al mio TextView. Il risultato è esattamente come se si allinea il TextView.


Crea una vista del bordo con il colore dello sfondo come il colore del bordo e la dimensione della tua vista del testo. imposta il riempimento della vista del bordo come larghezza del bordo. Imposta il colore di sfondo della vista del testo come colore desiderato per la vista del testo. Ora aggiungi la tua vista di testo all'interno della vista del bordo.


Ho risolto questo problema estendendo la vista testo e disegnando manualmente un bordo. Ho persino aggiunto in modo che tu possa 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 :)


È possibile impostare il bordo con due metodi. Uno è disegnabile e il secondo è programmatico.

Utilizzando 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>

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;
}

Puoi impostare una forma disegnabile (un rettangolo) come sfondo per la vista.

<TextView android:text="Some text" android:background="@drawable/back"/>

E rettangolo drawable back.xml (metti in 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>

Puoi usare @android:color/transparent per il colore solido per avere uno sfondo trasparente. Puoi anche usare il padding per separare il testo dal bordo. per ulteriori informazioni consultare: http://developer.android.com/guide/topics/resources/drawable-resource.html


Ho avuto questo problema quando stavo usando TextView all'interno del ScrollView . Questa soluzione ha funzionato per me.

scrollView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(false);

                return false;
            }
        });

        description.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                description.getParent().requestDisallowInterceptTouchEvent(true);

                return false;
            }
        });






android android-layout textview android-textview