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
|
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 = {"●", "■", "▲", "✚", "★", "♦", "✿"};
|
||||||
|
|
||||||
|
// Données nécessaires au dessin
|
||||||
|
|
||||||
private int[][] grille = new int[NB_LIGNES][NB_COLONNES];
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user