J'ai trois fichiers. Le XML, la fonction de dessin et l'activité principale. J'ai quelques LinearLayout
dans mon fichier XML.
<LinearLayout Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_weight="1">
<LinearLayout Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_weight="1"
Android:background="#ef3"
Android:id="@+id/img01"/>
<LinearLayout Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_weight="1"
Android:background="#E8A2B4"
Android:id="@+id/img02"/>
</LinearLayout>
C'est la fonction draw:
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 voici 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 tracer une bordure mais la taille ne correspondait pas à la LinearLayout
. Et lorsque je clique à nouveau sur le LinearLayout
, le programme se bloque.
Autre chose, je veux tracer deux cercles au centre de la LinearLayout
, mais comment pourrais-je calculer les coordonnées du centre?
Avez-vous vraiment besoin de le faire par programme?
Juste en considérant le titre: Vous pouvez utiliser un ShapeDrawable comme Android: fond…
Par exemple, définissons res/drawable/my_custom_background.xml
comme:
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<corners
Android:radius="2dp"
Android:topRightRadius="0dp"
Android:bottomRightRadius="0dp"
Android:bottomLeftRadius="0dp" />
<stroke
Android:width="1dp"
Android:color="@Android:color/white" />
</shape>
et définissez Android: background = "@ drawable/my_custom_background".
Je n'ai pas testé mais ça devrait marcher.
Mise à jour:
Je pense qu'il est préférable de tirer parti de la puissance des ressources exploitables sous forme xml si cela répond à vos besoins. Avec un projet "from scratch" (pour Android-8), définissez res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/border"
Android:padding="10dip" >
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Hello World, SOnich"
/>
[... more TextView ...]
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Hello World, SOnich"
/>
</LinearLayout>
et un res/drawable/border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<stroke
Android:width="5dip"
Android:color="@Android:color/white" />
</shape>
Signalé de travailler sur un appareil de pain d'épice. Notez que vous devez associer Android:padding
de LinearLayout à la valeur de Android:width
forme/trait. Veuillez ne pas utiliser @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"
à chacun des LinearLayout à partir de votre exemple fourni.
En ce qui concerne vos autres articles liés à l'affichage de cercles comme fond de LinearLayout, je joue avec des ressources dessinables en médaillon/Echelle/Calque ( voir Ressources dessinables pour plus d'informations) afin d'obtenir un résultat permettant d'afficher des cercles parfaits dans l’arrière-plan d’un LinearLayout mais qui a échoué pour le 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 passer à côté de l'essentiel: pourquoi le faites-vous par programme? Avez-vous besoin d'un comportement dynamique? Vos entrées sont-elles en png ou ShapeDrawable est-il acceptable? etc.
A suivre (peut-être demain et dès que vous aurez plus de précisions sur ce que vous voulez réaliser)…
Étendez LinearLayout/RelativeLayout et utilisez-le directement sur 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, AttributeSet 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) ;
}
}
<?xml version="1.0" encoding="utf-8"?>
<com.pkg_name.LinearLayoutOutlined
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width=...
Android:layout_height=...
>
... your widgets here ...
</com.pkg_name.LinearLayoutOutlined>