Bonjour,
Je débute, autant en java, qu'en Android. Avec plus de 15 ans d'expérience en C et autres langages. Et c'est probablement la source de mes difficultés.
J'apprends par la pratique. Mon sujet d'apprentissage, censé m'apporter quelques bases, est le suivant :
- une première activité, affiche une vue avec des boutons. Une partie de ces boutons fait défiler des textes venant de la ressource string.xml. Une seconde partie génère des valeurs entières, que je stocke dans un tableau d'entier. et enfin un dernier bouton lance une seconde activité, en lui transférant le tableau de données par un intent.
Jusque là, c'est ok, j'ai réussi à faire ce que je voulais.
- Ce que je cherche à faire maintenant, c'est dessiner un graphe dans la vue (layout ? - voir plus bas) de la seconde activité, disons cinq rectangles. Et là je sèche, par manque de compréhension des concepts de base.
Ce que j'ai compris :
- il faut un bitmap, puis un canvas pour dessiner sur le bitmap, et enfin un paint.
Je pensais qu'il suffisait d'enchaîner tout celà dans onCreate. Mais rien ne se dessine.
En cherchant, je trouve que les dessins sont à effectuer dans la méthode de callback onDraw. Plus loin, je trouve : onDraw sera appelée à chaque fois que la vue juge que c'est nécessaire. Si vous voulez indiquer manuellement à la vue qu'elle doit se redessiner le plus vite possible, on peut le faire en utilisant la méthode void invalidate().
Là je ne comprends plus. Ce texte semble dire que les méthodes permettant de dessiner (par exemple c.drawRect(x, y, z, h, p) ou c est un objet de type canvas) sont à appeler dans une méthode qui est exécutée, en gros, lorsque le dessin s'exécute (si j'en crois son nom : onDraw...)
je sents confusément qu'il me manque à mettre en oeuvre un objet de type view. Mais j'ai beau lire et re-lire toutes les docs qui trainent, je ne comprends pas l'articulation / différence entre view et layout.
Quelqu'un peut-il m'expliquer les bases du dessin ? simple, pour commencer. Il ne s'agit pas de la grande artillerie permettant de faire des graphismes animés à grande vitesse à la candy crush. Juste dessiner/afficher des formes simples (lignes, rectangles) à géométrie fixée par des entiers variables, sur l'écran d'une activité.
Ci-dessous mes codes actuels :
Le manifest :
Le java de l'activité dans lequel j'ai mis le code pour dessiner (un rectangle) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.co.and.xxxx.atcs" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ResultActivity" > </activity> </application> </manifest>
et le layout de cette activité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 package com.co.and.xxxxx.atcs; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import android.content.Intent; import static android.widget.Toast.LENGTH_LONG; import static com.co.and.paludetto.atcs.MainActivity.*; public class ResultActivity extends AppCompatActivity { private String txt; public int notes[] = new int[60]; @Override protected void onCreate(Bundle savedInstanceState) { Intent i = getIntent(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_result_1); notes = i.getIntArrayExtra(MainActivity.NOTES); txt = notes[0]+" "+" "+notes[1]+" "+notes[2]+" "+notes[3]+" "+notes[4]; Toast.makeText(ResultActivity.this, "onCreate", Toast.LENGTH_LONG).show(); Toast.makeText(ResultActivity.this, txt, Toast.LENGTH_LONG).show(); /* c.drawColor(660);*/ Bitmap b = Bitmap.createBitmap(128,128, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); p.setStyle(Paint.Style.STROKE); /* p.setColor(Color.parseColor("#66666666"));*/ p.setColor(Color.rgb(125, 125, 125)); p.setStrokeWidth(10); c.drawRect(100, 100, 200, 200, p); Toast.makeText(ResultActivity.this, "drawRect", Toast.LENGTH_LONG).show(); } public void onDraw(Canvas c) { Toast.makeText(ResultActivity.this, "onDraw", LENGTH_LONG).show(); Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); p.setStyle(Paint.Style.STROKE); /* p.setColor(Color.parseColor("#66666666"));*/ p.setColor(Color.rgb(125, 125, 125)); p.setStrokeWidth(10); c.drawRect(100, 100, 200, 200, p); } }
J'ai pas reproduit code et layout de la première activité qui ne pose à priori pas de problèmes, et qui n'ont aucune adhérence avec le sujet, si j'ai bien compris...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.co.and.paludetto.atcs.ResultActivity"> </RelativeLayout>
seuls les toasts dans onCreate envoient un texte. Donc onDraw n'est pas exécuté. Et rien ne se dessine sur mon écran tout blanc...
Que manque-t-il ?
Merci d'avance pour votre aide.
Partager