Aller au contenu

dessiner dans un framelayout


rsuinux

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.

Lien vers le commentaire
Partager sur d’autres 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!

Lien vers le commentaire
Partager sur d’autres 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.

Modifié par rsuinux
Lien vers le commentaire
Partager sur d’autres 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)

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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>

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...