Android: comment dessiner une bordure sur un LinearLayout

J’ai trois fichiers. Le XML, la fonction de dessin et l’activité principale. J’ai un LinearLayout dans mon fichier XML.

     

Ceci est la fonction de dessin:

 public class getBorder extends TextView { public getBorder(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(android.graphics.Color.RED); canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint); canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint); canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1, this.getHeight() - 1, paint); canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1, this.getHeight() - 1, paint); } } 

Et c’est l’activité principale:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final getBorder getBorder = new getBorder(this); final LinearLayout img01 = (LinearLayout) findViewById(R.id.img01); img01.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub getBorder.setWidth(100); getBorder.setHeight(100); img01.addView(getBorder); } }); } 

Le programme pouvait dessiner une bordure mais la taille ne correspondait pas à LinearLayout . Et lorsque je clique à nouveau sur LinearLayout , le programme se bloque.

Une autre chose, je veux dessiner deux cercles au centre du LinearLayout , mais comment pourrais-je déterminer les coordonnées du centre?

Avez-vous vraiment besoin de le faire par programmation?

Juste en considérant le titre: Vous pourriez utiliser un ShapeDrawable comme Android: fond…

Par exemple, définissons res/drawable/my_custom_background.xml comme res/drawable/my_custom_background.xml :

     

et définir android: background = “@ drawable / my_custom_background”.

Je n’ai pas testé mais ça devrait marcher.

Mettre à jour:

Je pense qu’il est préférable de tirer parti de la puissance de ressources pouvant être dessinée au format XML si cela répond à vos besoins. Avec un projet “from scratch” (pour android-8), définissez res / layout / main.xml

    [... more TextView ...]   

et res/drawable/border.xml

     

Signalé pour travailler sur un dispositif de pain d’épice. Notez que vous devrez relier android:padding de LinearLayout à la forme android:width / valeur de trait. S’il vous plaît, n’utilisez pas @android:color/white dans votre application finale, mais plutôt une couleur définie par le projet.

Vous pouvez appliquer android:background="@drawable/border" android:padding="10dip" à chaque LinearLayout de votre échantillon fourni.

En ce qui concerne vos autres articles relatifs à l’affichage de cercles comme arrière-plan de LinearLayout, je joue avec des ressources pouvant être insérées / mises à l’échelle / calques ( voir Ressources dessinées pour plus d’informations) pour afficher des cercles parfaits en arrière-plan en ce moment…

Votre problème réside clairement dans l’utilisation de getBorder.set{Width,Height}(100); . Pourquoi faites-vous cela dans une méthode onClick?

J’ai besoin d’informations supplémentaires pour ne pas rater le point: pourquoi faites-vous cela par programmation? Avez-vous besoin d’un comportement dynamic? Vos fichiers en entrée sont png ou ShapeDrawable est acceptable? etc.

A suivre (peut-être demain et dès que vous apportez plus de précisions sur ce que vous voulez réaliser)…

Étendre LinearLayout / RelativeLayout et l’utiliser directement sur le XML

 package com.pkg_name ; ...imports... public class LinearLayoutOutlined extends LinearLayout { Paint paint; public LinearLayoutOutlined(Context context) { super(context); // TODO Auto-generated constructor stub setWillNotDraw(false) ; paint = new Paint(); } public LinearLayoutOutlined(Context context, AtsortingbuteSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub setWillNotDraw(false) ; paint = new Paint(); } @Override protected void onDraw(Canvas canvas) { /* Paint fillPaint = paint; fillPaint.setARGB(255, 0, 255, 0); fillPaint.setStyle(Paint.Style.FILL); canvas.drawPaint(fillPaint) ; */ Paint strokePaint = paint; strokePaint.setARGB(255, 255, 0, 0); strokePaint.setStyle(Paint.Style.STROKE); strokePaint.setStrokeWidth(2); Rect r = canvas.getClipBounds() ; Rect outline = new Rect( 1,1,r.right-1, r.bottom-1) ; canvas.drawRect(outline, strokePaint) ; } } 

   ... your widgets here ...