Jump to content

dessiner dans un framelayout


rsuinux
 Share

Recommended Posts

bonjour,

je débute avec le systeme android, et j'aimerai dessiner dans un framelayout.

Mon xml de l'interface ce présente (en partie) comme ça:

<?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorHoriz"
    android:gravity="center"
    android:orientation="horizontal" >
../... mes boutons ici .../...
<FrameLayout
	    android:id="@+id/Tableadessin"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:layout_alignParentBottom="true"
	    android:layout_alignParentLeft="false"
	    android:layout_below="@id/EditTextValeurX"
	    android:foreground="@color/color_tableadessin" >
    </FrameLayout>
   </RelativeLayout>

Ma question est de savoir si je peux dessiner dans ce framelayout ou s'il faut le transformer "en surface ou je peux dessiner"?

Je veux juste tracer 2 axes (x et y ) puis des données de type ligne brisées. Et evidemment, je n'y arrive pas trop... Sinon, je ne serais pas là.

Tout mon code fonctionne, la partie algorithmique sans soucis, (je verifié avec du log.d ) reste la partie graphique à faire :)

Merci si vous avez des docs à me proposer.

Rémi.

Link to comment
Share on other sites

Merci substitut pour ton avis. J'avoue avoir quelques difficultés à dessiner juste dans mon FrameLayout. Toutes les docs que j'ai pu trouver font références à une méthodologie pour dessiner sur 'tout l'écran' pas juste sur une partie. Quand on debute avec android et le dessin, c'est assez déconcertant!

Link to comment
Share on other sites

j'avance dans mon apprentissage.

A présent, j'arrive à dessiner dans mon framelayout, mais j'ai quelques soucis... oh, pas grand chose. J'explique:

Dans mon code, je fais quelques initialisations, dont mon framelayout:

.../...
FrameLayout montableau;
.../...
montableau = (FrameLayout) findViewById(R.id.Tableadessin);
.../...

puis je continue mon code jusqu'à mon écouteur de bouton:

Calcul.setonclickListener(
new onclickListener() {
 public void onclick ( View v) {
	 affichage_axes(); // ici ça marche au poil!
.../...

ma méthode affichage_axes trace juste les axes x et y dans mon framelayout. Jusque là, tout va bien. En plus, dans affichage_axes, j'utilise dx=montableau.getWidth(); et dy=montableau.getHeight(); pour connaitre les largeur et hauteur de ma surface de dessin. Jusque la, tout va bien.

Mais, j'ai voulu bouger mon appel à affichage_axes(); juste après la déclaration de montableau , comme ceci:

.../...
montableau = (FrameLayout) findViewById(R.id.Tableadessin);
affichage_axes(); // marche plus!!! bouhhhh!!!
.../...

De plus, dx et dy sont systématiquement à zéro. J'en viens à me dire qu'il n'y a pas encore eu d'initialisation de l'écran, n'est-ce pas? Et donc, comment puis-je contourner (est-ce possible?) ce petit soucis? Sinon, je laisse comme ça!

Rémi.

Edited by rsuinux
Link to comment
Share on other sites

Effectivement, il ne passe rien, car tu appelles ta méthode d'affichage depuis onCreate (je suppose), et donc à un moment où ton Activity n'est pas encore affichée (d'où les dimensions à 0 par ex.)

D'une manière générale, Android étant événementiel, il ne faut dessiner que lorsque le système te le demande, et non quand toi tu veux.

Dans ton cas, une solution (il y en a d'autres) serait d'implémenter un objet de type View qui te soit spécifique, et qui prendrait en charge le dessin de ta zone d'affichage. Ainsi, ensuite, Android peut s'appuyer sur cet objet pour dessiner l'écran quand il en a besoin

Donc:

- tu implémentes une nouvelle classe, qui hérite de View, dans laquelle tu redéfinis la méthode onDraw, méthode qui reçoit en paramètre un Canvas que tu peux utiliser pour dessiner. onDraw sera automatiquement appelée par Android.

- dans ton layout, tu remplaces le FrameLayout par ton nouvel objet (remplacer le tag FrameLayout par un tag ayant pour nom celui de ta classe, package compris)

- dans ton Activity, tu récupères maintenant une instance de ton nouvel objet au lieu du FrameLayout (si tu en as besoin)

Link to comment
Share on other sites

désolé de ne pas avoir répondu plus vite, j'étais pris par des évènements médiévaux....

Je reviens à la Vraie vie!!!! (pas de prise réseau ni de wifi au XIIIème sciècle !!!! )

je vais donc tester ta solution.

Merci de ton avis.

Link to comment
Share on other sites

  • 3 weeks later...

Tu peux faire ça simplement comme chpil l'a dit plus haut :

La view :

package com.abecker.androidsandbox;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class TableauView extends View{
public TableauView(Context context, AttributeSet attrs) {
 super(context, attrs);
}

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 //
 //faire les opérations de dessins ici
 //
}

}

Le layout xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
   <com.your.package.TableauView
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...