ajustement vueGrille

This commit is contained in:
sehl
2026-03-29 00:30:52 +01:00
parent f6a11af157
commit 7a4be9fac6
+41 -57
View File
@@ -1,5 +1,5 @@
package sae.chuzzle; // séparer le dessin de la grille et des éléments package sae.chuzzle;
// et vérifie les math à la fin beleck c chelou
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
@@ -22,16 +22,15 @@ public class VueGrille extends View {
/** Symboles pour le mode daltonien, un par type. */ /** Symboles pour le mode daltonien, un par type. */
private static final String[] SYMBOLES = {"", "", "", "", "", "", ""}; 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]; 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 int animIndex = 0;
private float animDecalagePx = 0f; private float animDecalagePx = 0f;
// Outils de dessin // Outils de dessin
private final Paint pinceauCase = new Paint(); private final Paint pinceauCase = new Paint();
@@ -64,11 +63,10 @@ public class VueGrille extends View {
pinceauSelection.setStrokeWidth(12f); pinceauSelection.setStrokeWidth(12f);
pinceauSelection.setColor(0xFFFFFFFF); pinceauSelection.setColor(0xFFFFFFFF);
// Chargement de l'image de la chaine
imageChaine = BitmapFactory.decodeResource(getResources(), R.drawable.chaine); imageChaine = BitmapFactory.decodeResource(getResources(), R.drawable.chaine);
} }
// API publique // -
public void definirGrille(int[][] nouvelleGrille) { public void definirGrille(int[][] nouvelleGrille) {
for (int l = 0; l < NB_LIGNES; l++) { for (int l = 0; l < NB_LIGNES; l++) {
@@ -77,8 +75,6 @@ public class VueGrille extends View {
invalidate(); invalidate();
} }
public void definirVerrous(boolean[][] nouveauxVerrous) { public void definirVerrous(boolean[][] nouveauxVerrous) {
for (int l = 0; l < NB_LIGNES; l++) { for (int l = 0; l < NB_LIGNES; l++) {
System.arraycopy(nouveauxVerrous[l], 0, verrous[l], 0, NB_COLONNES); System.arraycopy(nouveauxVerrous[l], 0, verrous[l], 0, NB_COLONNES);
@@ -86,8 +82,7 @@ public class VueGrille extends View {
invalidate(); invalidate();
} }
// animation de glissement
// API animation de glissement (appelée par GestionnaireTactile)
public void definirGlissement(boolean estLigne, int index, float decalagePx) { public void definirGlissement(boolean estLigne, int index, float decalagePx) {
this.animEstLigne = estLigne; this.animEstLigne = estLigne;
@@ -101,23 +96,6 @@ public class VueGrille extends View {
invalidate(); 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 // Dessin
@Override @Override
@@ -133,18 +111,18 @@ public class VueGrille extends View {
} }
} }
int largeur = getWidth(); int largeur = getWidth() - getPaddingLeft() - getPaddingRight();
int hauteur = getHeight(); int hauteur = getHeight() - getPaddingTop() - getPaddingBottom();
float tailleCase = Math.min( float tailleCase = Math.min(
largeur / (float) NB_COLONNES, largeur / (float) NB_COLONNES,
hauteur / (float) NB_LIGNES hauteur / (float) NB_LIGNES
); );
float margeGauche = (largeur - tailleCase * NB_COLONNES) / 2f; float margeGauche = getPaddingLeft() + (largeur - tailleCase * NB_COLONNES) / 2f;
float margeHaut = (hauteur - tailleCase * NB_LIGNES) / 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.save();
canvas.clipRect(margeGauche, margeHaut, canvas.clipRect(margeGauche, margeHaut,
margeGauche + NB_COLONNES * tailleCase, margeGauche + NB_COLONNES * tailleCase,
@@ -186,30 +164,29 @@ public class VueGrille extends View {
float margeGauche, float margeHaut, float margeGauche, float margeHaut,
float offsetX, float offsetY) { float offsetX, float offsetY) {
int type = grille[ligne][colonne];
float largeurGrille = NB_COLONNES * tailleCase; float largeurGrille = NB_COLONNES * tailleCase;
float hauteurGrille = NB_LIGNES * tailleCase; float hauteurGrille = NB_LIGNES * tailleCase;
// Dessin case principale // 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) { if (offsetX != 0f) {
float bordD = margeGauche + largeurGrille; float bordD = margeGauche + largeurGrille;
float bordG = margeGauche; float bordG = margeGauche;
if (x2 > bordD) { 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) { } 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) { if (offsetY != 0f) {
float bordB = margeHaut + hauteurGrille; float bordB = margeHaut + hauteurGrille;
float bordH = margeHaut; float bordH = margeHaut;
if (y2 > bordB) { 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) { } 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. * Dessine le rectangle coloré d'une case + verrou + symbole daltonien.
* Ajoute un contour gras si la case est sélectionnée. * 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, int ligne, int colonne,
float x1, float y1, float x2, float y2) { float x1, float y1, float x2, float y2) {
int type = grille[ligne][colonne];
definirCouleur(type); definirCouleur(type);
canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceauCase); canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceauCase);
if (animEstLigne != null) { 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); canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceauSelection);
} }
} }
@@ -240,23 +220,14 @@ public class VueGrille extends View {
float cx = (x1 + x2) / 2f; float cx = (x1 + x2) / 2f;
float cy = (y1 + y2) / 2f - (pinceauSymbole.descent() + pinceauSymbole.ascent()) / 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 // Dessin de l'image de la chaine si verrouillée
if (verrous[ligne][colonne] && imageChaine != null) { if (verrous[ligne][colonne] && imageChaine != null) {
float size = (x2 - x1); float size = (x2 - x1);
float chainSize = size * 0.55f; // Taille de chaque morceau de chaine float chainSize = size * 0.55f;
// Dessin d'une chaine en haut à gauche
canvas.drawBitmap(imageChaine, null, new RectF(x1, y1, x1 + chainSize, y1 + chainSize), null); 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); 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; 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;
}
} }