rsuinux Posted August 26, 2012 Share Posted August 26, 2012 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. Quote Link to comment Share on other sites More sharing options...
Substitut Posted August 28, 2012 Share Posted August 28, 2012 Je pense qu'il doit falloir intégrer un Canvas a ton FrameLayout pout dessiner quelque chose dedans. Quote Link to comment Share on other sites More sharing options...
rsuinux Posted August 28, 2012 Author Share Posted August 28, 2012 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! Quote Link to comment Share on other sites More sharing options...
rsuinux Posted August 31, 2012 Author Share Posted August 31, 2012 (edited) 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 August 31, 2012 by rsuinux Quote Link to comment Share on other sites More sharing options...
chpil Posted August 31, 2012 Share Posted August 31, 2012 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) Quote Link to comment Share on other sites More sharing options...
rsuinux Posted September 2, 2012 Author Share Posted September 2, 2012 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. Quote Link to comment Share on other sites More sharing options...
Cuillère Posted September 19, 2012 Share Posted September 19, 2012 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> Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.