Comment puis-je mettre une bordure autour d'une vue de texte Android?

Est-il possible de tracer une bordure autour d'une vue de texte?

  • Pourquoi une classe fragmentaire pourrait-elle ne pas être valide?
  • Prenez un délai de quelques secondes sans utiliser de fil
  • Android - téléchargement d'image depuis le Web, sauvegarde dans la mémoire interne dans l'emplacement privé vers l'application, affichage pour l'élément de la liste
  • Android: changer les écrans avec une nouvelle activité ou simplement changer la vue du contenu
  • Java.lang.NullPointerException (aucun message d'erreur)
  • Valeurs de sortie trouvées dans curseur sur logcat? - Android
  • Android - Grow Heap (Frag Case) - Allocation de l'octet ... Pas de chargement de bitmaps
  • Pouvez-vous déployer à plusieurs reprises un APK avec 'adb install' sans désinstaller le premier?
  • Android: l'analyse par DOM vs SAX vs XMLPullParser?
  • Android: Google Places Autocomplete - Comment puis-je l'utiliser pour remplir un RecyclerView plutôt qu'un menu déroulant?
  • Forcer la tablette à utiliser les ressources de xhdpi
  • Différence entre START_STICKY et START_REDELIVER_INTENT?
  • 13 Solutions collect form web for “Comment puis-je mettre une bordure autour d'une vue de texte Android?”

    Vous pouvez définir une forme dessiné (un rectangle) en tant que fond pour la vue.

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

    Et rectangle drawable back.xml (mis dans le dossier 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> 

    Vous pouvez utiliser @android:color/transparent pour que la couleur @android:color/transparent transparente. Vous pouvez également utiliser le rembourrage pour séparer le texte de la bordure. Pour plus d'informations, voir: http://developer.android.com/guide/topics/resources/drawable-resource.html

    Permettez-moi de résumer quelques méthodes différentes (non programmables).

    Utilisation d'une forme dessinable

    Enregistrez les éléments suivants comme fichier XML dans votre dossier dédié (par exemple, 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> 

    Ensuite, définissez-le comme arrière-plan de votre TextView:

     <TextView android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/my_border" /> 

    Plus d'aide:

    • Forme déplaçable (documents Android)
    • Astuces et astuces de développement Android: XML Drawables (Part I)

    Utilisation d'un patch 9

    Un patch 9 est une image d'arrière plan extensible. Si vous créez une image avec une bordure, elle donnera à votre TextView une bordure. Tout ce que vous devez faire est de créer l'image, puis de la définir dans l'arrière-plan dans votre TextView.

     <TextView android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/my_ninepatch_image" /> 

    Voici quelques liens qui montrent comment créer une image de 9 patchs:

    • Draw 9-patch
    • Simple Nine-Patch Generator
    • Un guide simple pour 9-patch pour l'interface utilisateur Android
    • Création et utilisation d'images de 9 patch dans Android

    Et si je veux juste la bordure supérieure?

    Utilisation d'une liste de couches

    Vous pouvez utiliser une liste de couches pour empiler deux rectangles les uns sur les autres. En rendant le deuxième rectangle juste un peu plus petit que le premier rectangle, vous pouvez créer un effet de bordure. Le premier rectangle (inférieur) est la couleur de bordure et le deuxième rectangle est la couleur d'arrière-plan.

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

    Définir android:top="2dp" le dessus (le rend plus petit) par 2dp. Cela permet d'afficher le premier rectangle (inférieur), en donnant un effet de bordure. Vous pouvez appliquer cela à l'arrière-plan TextView de la même façon que la shape dessiné a été effectuée ci-dessus.

    Voici d'autres liens sur les listes de couches:

    • Comprendre la <couche-list> de l'Android
    • Comment faire la bordure inférieure dans un sélecteur XML de forme élastique?
    • Créez-vous des bordures sur une vue Android dans XML xylable, sur 3 côtés?

    Utilisation d'un patch 9

    Vous pouvez simplement créer une image de 9 patch avec une seule bordure. Tout le reste est le même que mentionné ci-dessus.

    Utilisation d'une vue

    C'est une sorte d'astuce, mais ça marche bien si vous devez ajouter un séparateur entre deux vues ou une bordure à une seule 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> 

    Voici d'autres liens:

    • Comment créer une ligne dans Android
    • Comment mettre une ligne de diviseur horizontal entre les textes d'édition dans une activité
    • Comment ajouter une ligne horizontale 1px au-dessus de la vue d'image dans une disposition relative?

    La manière simple est d'ajouter une vue pour votre TextView. Exemple pour la ligne de bordure inférieure:

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

    Pour les autres bordures de direction, ajustez l'emplacement de la vue séparatrice.

    J'ai résolu ce problème en étendant la vision du texte et en dessinant une bordure manuellement. J'ai même ajouté afin que vous puissiez sélectionner si une bordure est pointillée ou pointillée.

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

    Et la classe de la frontière:

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

    J'espère que ça aide quelqu'un 🙂

    J'étais en train de regarder une réponse similaire: il est possible d'effectuer une course et la suppression suivante:

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

    J'ai trouvé une meilleure façon de mettre une bordure autour d'un TextView.

    Utilisez une image de neuf patch pour l'arrière-plan. C'est assez simple, le SDK est livré avec un outil pour créer l'image de 9 patch, et cela implique absolument aucun codage.

    Le lien est http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch .

    Vérifiez le lien ci-dessous pour créer des coins arrondis http://androidcookbook.com/Recipe.seam?recipeId=2318

    Le dossier drawable, sous res, dans un projet Android n'est pas limité aux bitmaps (fichiers PNG ou JPG), mais il peut également contenir des formes définies dans les fichiers XML.

    Ces formes peuvent alors être réutilisées dans le projet. Une forme peut être utilisée pour mettre une bordure autour d'une disposition. Cet exemple montre une bordure rectangulaire avec des coins courbes. Un nouveau fichier appelé customborder.xml est créé dans le dossier drawable (dans Eclipse, utilisez le menu Fichier et sélectionnez Nouveau puis Fichier, avec le type de dossier sélectionné dans le nom du fichier, puis cliquez sur Terminer).

    Le XML définissant la forme de bordure est entré:

     <?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'attribut android:shape est définie sur le rectangle (les fichiers de forme prennent également en charge l'ovale, la ligne et l'anneau). Rectangle est la valeur par défaut, donc cet attribut pourrait être laissé de côté s'il s'agit d'un rectangle défini. Consultez la documentation Android sur les formes à http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape pour des informations détaillées sur un fichier de forme.

    Les coins des éléments définissent les angles de rectangle à arrondir. Il est possible de définir un rayon différent sur chaque coin (voir la référence d'Android).

    Les attributs de rembourrage sont utilisés pour déplacer le contenu de la vue sur lequel la forme est appliquée, afin d'éviter que le contenu chevauche la bordure.

    La couleur de bordure ici est définie sur un gris clair (valeur RVB hexadécimale CCCCCC).

    Les formes prennent également en charge les gradients, mais cela n'est pas utilisé ici. Encore une fois, voir les ressources Android pour voir comment un dégradé est défini. La forme est appliquée au laxtout en utilisant android:background="@drawable/customborder" .

    Dans la mise en page, d'autres vues peuvent être ajoutées normalement. Dans cet exemple, un seul TextView a été ajouté, et le texte est blanc (FFFFFF hexadécimal RVB). L'arrière-plan est réglé sur bleu, plus une certaine transparence pour réduire la luminosité (A00000FF hexadécimal alpha RGB value). Enfin, la disposition est décalée du bord de l'écran en la plaçant dans une autre disposition avec une petite quantité de rembourrage. Le fichier de mise en page complet est donc:

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

    Vous pouvez ajouter quelque chose comme ceci dans votre code:

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

    Vous pouvez définir la bordure selon deux méthodes. L'un est par drawable et le second est programmé.

    Utilisation de 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> 

    Programmation


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

    J'ai un moyen de le faire très simple, et j'aimerais le partager.

    Quand je veux mordre mes TextViews, je les mets juste dans un LinearLayout. Je définis la couleur de fond de mon LinearLayout, et j'ajoute un rembourrage à mon TextView. Le résultat est exactement comme si vous placez le TextView.

    Voici ma classe d'aide «simple» qui renvoie un ImageView avec la bordure. Déposez-le dans votre dossier utils, et appelez-le comme ceci:

     ImageView selectionBorder = BorderDrawer.generateBorderImageView(context, borderWidth, borderHeight, thickness, Color.Blue); 

    Voici le code.

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

    Cela peut vous aider.

     <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 

    En fait, c'est très simple. Si vous voulez un simple rectangle noir derrière la Textview, ajoutez simplement android:background="@android:color/black" dans les tags TextView. Comme ça:

     <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"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.