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