ajustement vueGrille
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user