From 7a4be9fac6550eb3fd53145b554143d9ebbe00e4 Mon Sep 17 00:00:00 2001 From: sehl Date: Sun, 29 Mar 2026 00:30:52 +0100 Subject: [PATCH] ajustement vueGrille --- src/main/java/sae/chuzzle/VueGrille.java | 102 ++++++++++------------- 1 file changed, 43 insertions(+), 59 deletions(-) diff --git a/src/main/java/sae/chuzzle/VueGrille.java b/src/main/java/sae/chuzzle/VueGrille.java index 20f2450..2da9f4f 100644 --- a/src/main/java/sae/chuzzle/VueGrille.java +++ b/src/main/java/sae/chuzzle/VueGrille.java @@ -1,5 +1,5 @@ -package sae.chuzzle; // séparer le dessin de la grille et des éléments - // et vérifie les math à la fin beleck c chelou +package sae.chuzzle; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -22,16 +22,15 @@ public class VueGrille extends View { /** Symboles pour le mode daltonien, un par type. */ private static final String[] SYMBOLES = {"●", "■", "▲", "✚", "★", "♦", "✿"}; - private int[][] grille = new int[NB_LIGNES][NB_COLONNES]; + // Données nécessaires au dessin + + private int[][] grille = new int[NB_LIGNES][NB_COLONNES]; private boolean[][] verrous = new boolean[NB_LIGNES][NB_COLONNES]; - // État du glissement - - private Boolean animEstLigne = null; + private Boolean animEstLigne = null; private int animIndex = 0; private float animDecalagePx = 0f; - // Outils de dessin private final Paint pinceauCase = new Paint(); @@ -64,11 +63,10 @@ public class VueGrille extends View { pinceauSelection.setStrokeWidth(12f); pinceauSelection.setColor(0xFFFFFFFF); - // Chargement de l'image de la chaine imageChaine = BitmapFactory.decodeResource(getResources(), R.drawable.chaine); } - // API publique + // - public void definirGrille(int[][] nouvelleGrille) { for (int l = 0; l < NB_LIGNES; l++) { @@ -77,8 +75,6 @@ public class VueGrille extends View { invalidate(); } - - public void definirVerrous(boolean[][] nouveauxVerrous) { for (int l = 0; l < NB_LIGNES; l++) { System.arraycopy(nouveauxVerrous[l], 0, verrous[l], 0, NB_COLONNES); @@ -86,8 +82,7 @@ public class VueGrille extends View { invalidate(); } - - // API animation de glissement (appelée par GestionnaireTactile) + // animation de glissement public void definirGlissement(boolean estLigne, int index, float decalagePx) { this.animEstLigne = estLigne; @@ -101,23 +96,6 @@ public class VueGrille extends View { invalidate(); } - /** - * Vérifie si la sélection actuelle (ligne ou colonne) contient au moins un verrou. - */ - private boolean estSelectionBloquee() { - if (animEstLigne == null) return false; - if (animEstLigne) { - for (int c = 0; c < NB_COLONNES; c++) { - if (verrous[animIndex][c]) return true; - } - } else { - for (int l = 0; l < NB_LIGNES; l++) { - if (verrous[l][animIndex]) return true; - } - } - return false; - } - // Dessin @Override @@ -133,21 +111,21 @@ public class VueGrille extends View { } } - int largeur = getWidth(); - int hauteur = getHeight(); + int largeur = getWidth() - getPaddingLeft() - getPaddingRight(); + int hauteur = getHeight() - getPaddingTop() - getPaddingBottom(); float tailleCase = Math.min( largeur / (float) NB_COLONNES, hauteur / (float) NB_LIGNES ); - float margeGauche = (largeur - tailleCase * NB_COLONNES) / 2f; - float margeHaut = (hauteur - tailleCase * NB_LIGNES) / 2f; + float margeGauche = getPaddingLeft() + (largeur - tailleCase * NB_COLONNES) / 2f; + float margeHaut = getPaddingTop() + (hauteur - tailleCase * NB_LIGNES) / 2f; - // - On limite le dessin à la zone de la grille + // Limite le dessin à la zone de la grille canvas.save(); - canvas.clipRect(margeGauche, margeHaut, - margeGauche + NB_COLONNES * tailleCase, + canvas.clipRect(margeGauche, margeHaut, + margeGauche + NB_COLONNES * tailleCase, margeHaut + NB_LIGNES * tailleCase); pinceauSymbole.setTextSize(tailleCase * 0.4f); @@ -186,30 +164,29 @@ public class VueGrille extends View { float margeGauche, float margeHaut, float offsetX, float offsetY) { - int type = grille[ligne][colonne]; float largeurGrille = NB_COLONNES * tailleCase; - float hauteurGrille = NB_LIGNES * tailleCase; + float hauteurGrille = NB_LIGNES * tailleCase; // Dessin case principale - dessinerRectCase(canvas, type, ligne, colonne, x1, y1, x2, y2); + dessinerRectCase(canvas, ligne, colonne, x1, y1, x2, y2); - // --- (réapparition de l'autre côté) + // Réapparition de l'autre côté (wrap) if (offsetX != 0f) { float bordD = margeGauche + largeurGrille; float bordG = margeGauche; if (x2 > bordD) { - dessinerRectCase(canvas, type, ligne, colonne, x1 - largeurGrille, y1, x2 - largeurGrille, y2); + dessinerRectCase(canvas, ligne, colonne, x1 - largeurGrille, y1, x2 - largeurGrille, y2); } else if (x1 < bordG) { - dessinerRectCase(canvas, type, ligne, colonne, x1 + largeurGrille, y1, x2 + largeurGrille, y2); + dessinerRectCase(canvas, ligne, colonne, x1 + largeurGrille, y1, x2 + largeurGrille, y2); } } if (offsetY != 0f) { float bordB = margeHaut + hauteurGrille; float bordH = margeHaut; if (y2 > bordB) { - dessinerRectCase(canvas, type, ligne, colonne, x1, y1 - hauteurGrille, x2, y2 - hauteurGrille); + dessinerRectCase(canvas, ligne, colonne, x1, y1 - hauteurGrille, x2, y2 - hauteurGrille); } else if (y1 < bordH) { - dessinerRectCase(canvas, type, ligne, colonne, x1, y1 + hauteurGrille, x2, y2 + hauteurGrille); + dessinerRectCase(canvas, ligne, colonne, x1, y1 + hauteurGrille, x2, y2 + hauteurGrille); } } } @@ -218,15 +195,18 @@ public class VueGrille extends View { * Dessine le rectangle coloré d'une case + verrou + symbole daltonien. * Ajoute un contour gras si la case est sélectionnée. */ - private void dessinerRectCase(Canvas canvas, int type, + private void dessinerRectCase(Canvas canvas, int ligne, int colonne, float x1, float y1, float x2, float y2) { + int type = grille[ligne][colonne]; + definirCouleur(type); canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceauCase); if (animEstLigne != null) { - if ((animEstLigne && ligne == animIndex) || (!animEstLigne && colonne == animIndex)) { + if ((animEstLigne && ligne == animIndex) + || (!animEstLigne && colonne == animIndex)) { canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceauSelection); } } @@ -240,23 +220,14 @@ public class VueGrille extends View { float cx = (x1 + x2) / 2f; float cy = (y1 + y2) / 2f - (pinceauSymbole.descent() + pinceauSymbole.ascent()) / 2f; - // Adapté au daltonien - canvas.drawText(SYMBOLES[type % NB_TYPES], cx, cy, pinceauSymbole); - + canvas.drawText(SYMBOLES[type % NB_TYPES], cx, cy, pinceauSymbole); // Dessin de l'image de la chaine si verrouillée if (verrous[ligne][colonne] && imageChaine != null) { - float size = (x2 - x1); - float chainSize = size * 0.55f; // Taille de chaque morceau de chaine - - // Dessin d'une chaine en haut à gauche + float size = (x2 - x1); + float chainSize = size * 0.55f; canvas.drawBitmap(imageChaine, null, new RectF(x1, y1, x1 + chainSize, y1 + chainSize), null); - - // Dessin d'une chaine en bas à droite canvas.drawBitmap(imageChaine, null, new RectF(x2 - chainSize, y2 - chainSize, x2, y2), null); - } else if (verrous[ligne][colonne]) { - // si l'image n'est pas trouvée - canvas.drawText("🔒", cx, cy, pinceauSymbole); } } @@ -271,4 +242,17 @@ public class VueGrille extends View { case 6: pinceauCase.setARGB(255, 255, 90, 90); break; } } + + /** Vérifie si la ligne/colonne en cours de glissement contient un verrou. */ + private boolean estSelectionBloquee() { + if (animEstLigne == null) return false; + if (animEstLigne) { + for (int c = 0; c < NB_COLONNES; c++) + if (verrous[animIndex][c]) return true; + } else { + for (int l = 0; l < NB_LIGNES; l++) + if (verrous[l][animIndex]) return true; + } + return false; + } }